std::optional
时间: 2023-06-21 13:17:12 浏览: 40
`std::optional`是C++17中引入的一个类模板,它代表一个可以包含或不包含某个值的可选对象。当对象包含值时,可以通过成员函数`value()`获取该值;当对象不包含值时,可以通过成员函数`has_value()`判断对象是否包含值。
`std::optional`在实现上类似于一个容器,它可以包含任意类型的值,包括基本类型、自定义类型、STL容器等等。当对象包含值时,实际上是在容器中存储该值,当对象不包含值时,容器中不存储任何值。这种机制可以避免在对象不包含值时占用过多的空间,从而提高程序的效率。
下面是一个使用`std::optional`的例子:
```
#include <iostream>
#include <optional>
std::optional<int> get_value(bool flag) {
if (flag) {
return 42;
} else {
return std::nullopt;
}
}
int main() {
auto value1 = get_value(true);
if (value1.has_value()) {
std::cout << value1.value() << std::endl; // 输出42
}
auto value2 = get_value(false);
if (!value2.has_value()) {
std::cout << "no value" << std::endl; // 输出no value
}
return 0;
}
```
上面的代码中,我们定义了一个函数`get_value`,它根据参数`flag`的值返回一个`std::optional<int>`对象,如果`flag`为true,则返回一个包含值为42的对象;如果`flag`为false,则返回一个不包含值的对象。
在`main`函数中,我们分别调用`get_value`函数,并检查返回的对象是否包含值。如果对象包含值,则输出该值;如果对象不包含值,则输出“no value”。
需要注意的是,当`std::optional`对象不包含值时,调用`value()`函数会触发未定义行为,因此在调用`value()`函数之前,应该先调用`has_value()`函数判断对象是否包含值。此外,`std::optional`对象的值类型必须是可复制、可移动的类型,否则会导致编译错误。