optional

std::optional

中定义的std::optional保留特定类型的值,或者不包含任何值。c++17引入,如果编译报错,需要加上-std=c++17选项

如果想要允许值是可以选择的,则可以将optional用于函数的参数。如果函数可能返回也可能不返回某些内容,则通常也将optional用作函数的返回类型。这消除了从函数中返回"特殊"值的需求,例如:nullptrend()-1EOF之类的。它还消除了将函数编写为返回代表成功或失败的布尔值的需求,同时将函数的实际结果存储在作为输出参数传递给函数的实参中。

optional是一个类模板,因此必须在<>中指定所需要的类型。如optional

用法示例:

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是无效的,但是,可以将指针保存在optional中。

你可能感兴趣的:(c++,c++17/20/23,c++,开发语言)