C++11/14/17 std::expected with functional-style extensions
Single header implementation of std::expected
with functional-style extensions.
Clang + GCC:
MSVC: 
Available on Vcpkg and Conan.
std::expected
is proposed as the preferred way to represent object which will either have an expected value, or an unexpected value giving information about why something failed. Unfortunately, chaining together many computations which may fail can be verbose, as error-checking code will be mixed in with the actual programming logic. This implementation provides a number of utilities to make coding with expected
cleaner.
For example, instead of writing this code:
std::expected<image,fail_reason> get_cute_cat (const image& img) {
auto cropped = crop_to_cat(img);
if (!cropped) {
return cropped;
}
auto with_tie = add_bow_tie(*cropped);
if (!with_tie) {
return with_tie;
}
auto with_sparkles = make_eyes_sparkle(*with_tie);
if (!with_sparkles) {
return with_sparkles;
}
return add_rainbow(make_smaller(*with_sparkles));
}
You can do this:
tl::expected<image,fail_reason> get_cute_cat (const image& img) {
return crop_to_cat(img)
.and_then(add_bow_tie)
.and_then(make_eyes_sparkle)
.map(make_smaller)
.map(add_rainbow);
}
The interface is the same as std::expected
as proposed in p0323r3, but the following member functions are also defined. Explicit types are for clarity.
map
: carries out some operation on the stored object if there is one.
tl::expected<std::size_t,std::error_code> s = exp_string.map(&std::string::size);
map_error
: carries out some operation on the unexpected object if there is one.
my_error_code translate_error (std::error_code);
tl::expected<int,my_error_code> s = exp_int.map_error(translate_error);
and_then
: like map
, but for operations which return a tl::expected
.
tl::expected<ast, fail_reason> parse (const std::string& s);
tl::expected<ast, fail_reason> exp_ast = exp_string.and_then(parse);
or_else
: calls some function if there is no value stored.
exp.or_else([] { throw std::runtime_error{"oh no"}; });
Compiler support
Tested on:
- Linux
- clang 6.0.1
- clang 5.0.2
- clang 4.0.1
- clang 3.9
- clang 3.8
- clang 3.7
- clang 3.6
- clang 3.5
- g++ 8.0.1
- g++ 7.3
- g++ 6.4
- g++ 5.5
- g++ 4.9
- g++ 4.8
- Windows
Acknowledgements
Thanks to Kévin Alexandre Boissonneault and Björn Fahller for various bug fixes.

To the extent possible under law, Sy Brand has waived all copyright and related or neighboring rights to the expected
library. This work is published from: United Kingdom.
Requires (1)
Tests
Reviews
Builds
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-gcc_14-static_O3 |
timestamp |
2025-09-10 13:36:42 UTC (27:01 minutes ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-gcc_14-O3 |
timestamp |
2025-09-10 13:34:35 UTC (29:08 minutes ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-gcc_14-ndebug_O3 |
timestamp |
2025-09-10 13:34:08 UTC (29:34 minutes ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-gcc_14 |
timestamp |
2025-09-10 13:31:01 UTC (32:41 minutes ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_fedora_40-gcc_14-bindist |
timestamp |
2025-09-10 12:41:56 UTC (01:21:46 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-w64-mingw32 |
tgt config |
windows_10-gcc_13.2_mingw_w64-static_O2 |
timestamp |
2025-09-10 12:31:43 UTC (01:32:00 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-w64-mingw32 |
tgt config |
windows_10-gcc_13.2_mingw_w64-O2 |
timestamp |
2025-09-10 12:30:31 UTC (01:33:12 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-gcc_12-bindist |
timestamp |
2025-09-10 12:29:42 UTC (01:34:00 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-gcc_14-static_O3 |
timestamp |
2025-09-10 12:29:39 UTC (01:34:04 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-w64-mingw32 |
tgt config |
windows_10-gcc_13.2_mingw_w64 |
timestamp |
2025-09-10 12:28:33 UTC (01:35:09 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-gcc_14-ndebug_O3 |
timestamp |
2025-09-10 12:27:32 UTC (01:36:10 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-gcc_14-O3 |
timestamp |
2025-09-10 12:25:52 UTC (01:37:51 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-clang_17_msvc_msvc_17.10 |
timestamp |
2025-09-10 12:25:13 UTC (01:38:30 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-gcc_14 |
timestamp |
2025-09-10 12:24:47 UTC (01:38:55 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_ubuntu_24.04-gcc_13-bindist |
timestamp |
2025-09-10 12:14:26 UTC (01:49:17 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-freebsd13.3 |
tgt config |
freebsd_13-clang_17 |
timestamp |
2025-09-10 12:12:00 UTC (01:51:43 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-freebsd14.1 |
tgt config |
freebsd_14-clang_18-O3 |
timestamp |
2025-09-10 12:11:39 UTC (01:52:04 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-freebsd14.1 |
tgt config |
freebsd_14-clang_18-static_O3 |
timestamp |
2025-09-10 12:10:47 UTC (01:52:56 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-clang_17_libc++ |
timestamp |
2025-09-10 12:08:33 UTC (01:55:09 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-gcc_13.1 |
timestamp |
2025-09-10 12:08:06 UTC (01:55:37 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-freebsd14.1 |
tgt config |
freebsd_14-clang_18 |
timestamp |
2025-09-10 12:07:59 UTC (01:55:44 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-clang_17 |
timestamp |
2025-09-10 12:07:33 UTC (01:56:09 hours ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-clang_17_libc++ |
timestamp |
2025-09-09 11:26:13 UTC (01 02:37:30 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-clang_17 |
timestamp |
2025-09-09 11:25:56 UTC (01 02:37:47 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-gcc_13 |
timestamp |
2025-09-09 11:18:50 UTC (01 02:44:52 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-msvc_17.10-static_O2 |
timestamp |
2025-09-09 00:17:58 UTC (01 13:45:45 days ago) |
result |
success | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-msvc_17.10-O2 |
timestamp |
2025-09-09 00:16:57 UTC (01 13:46:45 days ago) |
result |
success | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-msvc_17.10 |
timestamp |
2025-09-09 00:14:01 UTC (01 13:49:42 days ago) |
result |
success | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-msvc_17.8-static_O2 |
timestamp |
2025-09-09 00:10:08 UTC (01 13:53:35 days ago) |
result |
success | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-msvc_17.8-O2 |
timestamp |
2025-09-09 00:08:35 UTC (01 13:55:07 days ago) |
result |
success | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-msvc_17.8 |
timestamp |
2025-09-09 00:03:56 UTC (01 13:59:46 days ago) |
result |
success | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-clang_18_libc++-static_O3 |
timestamp |
2025-09-08 15:17:49 UTC (01 22:45:54 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-clang_18_libc++-O3 |
timestamp |
2025-09-08 15:16:33 UTC (01 22:47:10 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-clang_18-static_O3 |
timestamp |
2025-09-08 15:15:56 UTC (01 22:47:47 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-clang_18-O3 |
timestamp |
2025-09-08 15:14:07 UTC (01 22:49:35 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-clang_18_llvm_msvc_17.10-static_O2 |
timestamp |
2025-09-08 15:05:01 UTC (01 22:58:42 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-clang_18_llvm_msvc_17.10-O2 |
timestamp |
2025-09-08 15:03:39 UTC (01 23:00:03 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-microsoft-win32-msvc14.3 |
tgt config |
windows_10-clang_18_llvm_msvc_17.10 |
timestamp |
2025-09-08 15:02:03 UTC (01 23:01:40 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-clang_18_libc++ |
timestamp |
2025-09-08 15:00:47 UTC (01 23:02:55 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
aarch64-linux-gnu |
tgt config |
linux_debian_12-clang_18 |
timestamp |
2025-09-08 14:54:13 UTC (01 23:09:29 days ago) |
result |
warning (test) | warning (test-installed) | log | rebuild |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-clang_18 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-clang_18-O3 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-clang_18-static_O3 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-clang_18_libc++ |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-clang_18_libc++-O3 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_debian_12-clang_18_libc++-static_O3 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-linux-gnu |
tgt config |
linux_fedora_39-gcc_13-bindist |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-apple-darwin22.5.0 |
tgt config |
macos_13-clang_15.0 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-apple-darwin23.5.0 |
tgt config |
macos_14-clang_15.0 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-apple-darwin23.5.0 |
tgt config |
macos_14-clang_15.0-O3 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-apple-darwin23.5.0 |
tgt config |
macos_14-clang_15.0-static_O3 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-apple-darwin23.5.0 |
tgt config |
macos_14-gcc_14_homebrew |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-apple-darwin23.5.0 |
tgt config |
macos_14-gcc_14_homebrew-O3 |
result |
unbuilt |
toolchain |
public-0.17.0 |
target |
x86_64-apple-darwin23.5.0 |
tgt config |
macos_14-gcc_14_homebrew-static_O3 |
result |
unbuilt |