• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..27-Feb-2022-

README.mdH A D27-Feb-20222.7 KiB4025

optional.hppH A D27-Feb-202227.7 KiB1,045758

test_optional.cppH A D27-Feb-202234.5 KiB1,4601,084

test_type_traits.cppH A D27-Feb-20221.7 KiB6744

README.md

1Optional
2========
3
4A single-header header-only library for representing optional (nullable) objects for C++14 (and C++11 to some extent) and passing them by value. This is the reference implementation of proposal N3793 (see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3793.html). Optional is now accepted into Library Fundamentals Technical Specification (see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3848.html). The interface is based on Fernando Cacciola's Boost.Optional library (see http://www.boost.org/doc/libs/1_52_0/libs/optional/doc/html/index.html)
5
6
7Usage
8-----
9
10```cpp
11optional<int> readInt(); // this function may return int or a not-an-int
12
13if (optional<int> oi = readInt()) // did I get a real int
14  cout << "my int is: " << *oi;   // use my int
15else
16  cout << "I have no int";
17```
18
19For more usage examples and the overview see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3527.html
20
21
22Supported compilers
23-------------------
24
25Clang 3.2, Clang 3.4, G++ 4.7.2, G++ 4.8.1. Tested only with libstdc++, versions 20130531, 20120920, 20110428. Others have reported it also works with libc++.
26
27
28
29Known Issues
30------------
31
32 - Currently, the reference (and the only known) implementation of certain pieces of functionality explore what C++11 identifies as undefined behavior (see national body comment FI 15: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3770.html#FI15). This is mostly why Optional was removed from C++14 and put into Library Fundamentals TS. Luckily what the Standard identifies as UB is well defined on all known platforms. We expect that the C++14 wil fix this problem, so that our trick becomes well-defined.
33 - In libstdc++ versions below 20130531 the constructor taking `initializer_list` argument is not `constexpr`. This is because `initializer_list` operations are not `constexpr` in C++11. This works however in version 20130531. It is also not enabled for libc++ because I do not have access to it and do nto know if it provides `constexpr` `initializer_list`.
34 - In G++ 4.7.2 and 4.8.0 member function `value_or` does not have rvalue reference overload. These compilers do not support rvalue overloding on `*this`.
35 - In order for the library to work with slightly older compilers, we emulate some missing type traits. On some platforms we cannot correctly detect the available features, and attempts at workarounds for missing type trait definitions can cause compile-time errors. Define macro `TR2_OPTIONAL_DISABLE_EMULATION_OF_TYPE_TRAITS` if you know that all the necessary type traits are defined, and no emulation is required.
36
37License
38-------
39Distributed under the [Boost Software License, Version 1.0](http://www.boost.org/LICENSE_1_0.txt).
40