std::optional
在<optional>
中定义的std::optional
保留特定类型的值,或者不包含任何值。c++17引入,如果编译报错,需要加上-std=c++17
选项
如果想要允许值是可以选择的,则可以将optional
用于函数的参数。如果函数可能返回也可能不返回某些内容,则通常也将optional
用作函数的返回类型。这消除了从函数中返回"特殊"值的需求,例如:nullptr
、end()
、-1
、EOF
之类的。它还消除了将函数编写为返回代表成功或失败的布尔值的需求,同时将函数的实际结果存储在作为输出参数传递给函数的实参中。
optional
是一个类模板,因此必须在<>
中指定所需要的类型。如optional<int>
。
用法示例:
optional<int> getData(bool val)
{
if (val)
{
return 99;
}
return nullopt; // c++17引入,空类型,等价于return {}
}
int main()
{
optional<int> data1{getData(true)};
optional<int> data2{getData(false)};
// 判断返回的data是否有值,1表示有值,0没值
cout << "data1 has_value = " << data1.has_value() << endl;
if (data2)
{
cout << "data2 has a value" << endl;
}
// 要是有值可以使用value()或者解引用运算符访问。
cout << "data1.has_value = " << data1.value() << endl;
cout << "data1.value = " << *data1 << endl;
// 还可以使用value_or()来返回optional的值,如果optional为空,则返回指定的值
cout << "data2.value = " << data2.value_or(7) << endl;
return 0;
}
输出结果:
data1 has_value = 1
data1.has_value = 99
data1.value = 99
data2.value = 7
注意:如果对于一个空的optional
使用value()
,就会抛出std::bad_optional_access
异常。同时不能将引用保存在optional
中,所以optional<T&>
是无效的,但是,可以将指针保存在optional
中。