template
class oprional;//since C++17
The class template std::optional manages an optional contained value, i.e. a value that may or may not be present.
optional一个常见的用法是作为一个可能失败的函数的返回值。
相比于std::pair<T,bool>,optional可以很好的处理昂贵的构造对象(The expansive-to-construct object),并且可读性也更好。
任何地方任何时候的optional
如果的optional
当optional
下列情况optional
- 通过一个类型为T的值(a value of type T)或者另一个包含值的optional
的实例初始化一个实例对象或者重新赋值。
下列情况optional
- 通过默认构造函数生成的实例对象。
- 实例对象通过std::nullopt或者通过另一个不包含值的optional
的实例初始化或者重新赋值。 - 实例对象调用reset()函数。
#include <functional>
#include <iostream>
#include <optional>
#include <string>
// optional can be used as the return type of a factory that may fail!
std::optional<std::string> create1(bool b) {
if (b)
return "Hello";
return {};
}
auto create2(bool b) {
return b ? std::optional<std::string>{"Hello"} : std::nullopt;
}
// std::reference_wrapper may be used to return a reference!
auto create_ref(bool b) {
static std::string value = "Hello";
return b ? std::optional<std::reference_wrapper<std::string>>{value}
: std::nullopt;
}
int main()
{
std::cout << "create(false) returned "<< create1(false).value_or("empty") << '
';
if (auto str = create2(true)) {
std::cout << "create2(true) returned " << *str << '
';
}
if (auto str = create_ref(true)) {
std::cout << "create_ref(true) returned " << str->get() << '
';
str->get() = "World";
std::cout << "modifying it changed it to " << str->get() << '
';
}
}