一、简介
std::optional
类型是 C++17 新增的特性,它表示一个可能包含值的对象,也可以表示没有值。使用它就可以不需要使用一些特殊的值(如 NULL)或者异常来表示缺失值。
使用 std::optional
,可以通过调用 std::nullopt
来表示没有值的情况。当 std::optional
包含值时,可以使用成员函数 value()
来获取该值,而且可以使用成员函数 has_value()
来检查是否有值。此外,还可以使用 *
运算符来获取值,类似于指针的解引用操作。
当一个 std::optional
对象被按语境转换成 bool 时,若对象含值则转换返回 true ,若对象不含值则返回 false 。
下面是一个使用 std::optional
的简单示例:
std::optional<int> divide(int a, int b)
{
if (b != 0)
{
return a / b;
}
else
{
return std::nullopt;
}
}
int main(int argc, char *argv[])
{
std::optional<int> result = divide(10, 5);
if (result.has_value())
{
qDebug() << "Result: " << result.value()<<*result;
}
else
{
qDebug() << "Invalid operation!";
}
}
二、其他
1、std::make_optional()
此函数模板接受一个参数,即要初始化的值,并返回一个
std::optional
对象,该对象包含了传入的值。
#include <iostream>
#include <optional>
struct MyStruct
{
int value;
};
int main(int argc, char *argv[])
{
std::optional<int> num1 = std::make_optional<int>(42);
std::cout << "num1: " << *num1 << std::endl;
std::optional<MyStruct> num2 = std::make_optional<MyStruct>({10});
std::cout << "num2: " << num2->value << std::endl;
return 0;
}
2、value_or()
此函数接受一个参数,即默认值。如果
std::optional
包含一个值,则该函数返回该值;如果std::optional
为空,则返回提供的默认值。
std::optional<int> num1 = 42;
int value = num1.value_or(0);
qDebug() << "Value: " << value; //42
std::optional<int> emptyNum;
int defaultValue = emptyNum.value_or(-1);
qDebug() << "Default Value: " << defaultValue; //-1
3、reset()
销毁
std::optional
对象中的值并释放相关的资源。
std::optional<int> num1 = 42;
qDebug() << "num1: " << *num1;
num1.reset();
if (!num1)
{
qDebug() << "num1 is empty.";
}
4、emplace()
在不提前创建临时对象的情况下,直接在
std::optional
对象中构造一个新的值。
5、std::nullopt
和 std::nullopt_t
std::nullopt
一个特殊的常量对象,用于表示空值的状态。当需要明确表示一个 std::optional 对象为空的时候,可以将其赋值为 std::nullopt。
示例用法:std::optional<int> value = std::nullopt;
std::nullopt_t
一个空的结构体类型,用于以明确标识空状态的初始化。当需要在构造 std::optional 对象时明确指明其为空的初始状态时,可以使用 std::nullopt_t 作为构造函数的参数。
示例用法:std::optional<int> value(std::nullopt_t{});
三种写法:
- std::optional<int> value = std::nullopt; //创建一个对象并将它的值赋值为空。(value此时是一个有效值,它的值表示的意思是“一个空值”)
- std::optional<int> value(std::nullopt_t{}); //直接创建一个空对象,该对象从创建好就是空的
- std::optional<int> value;