在 C++17 中,是否可以使用带有初始值设定项的 if 语句来解压可选项?

Sco*_*ham 7 c++ c++17 stdoptional

我正在使用 std::optional 编写一些代码,并且想知道 C++17 的“带有初始化程序的 if 语句”是否能够帮助解压缩值?

std::optional<int> optionalInt = GetOptionalInt();
Run Code Online (Sandbox Code Playgroud)

我在这里编写函数 Unpack:

if( auto [value, has_value] = optionalInt.Unpack(); has_value )
{
    // Use value here.
}
Run Code Online (Sandbox Code Playgroud)

但是,我的问题是。C ++ 17“带有初始化程序的if语句”在这里有帮助吗?如果是这样,它将如何编码?

更新,这实际上主要是使用 optional 时的一个问题,这非常容易被误用,因为 optional 和 *optional 都返回 bool 并且当有人尝试访问该值并忘记 *.

Bar*_*rry 6

没有,也不可能有,这样的 Unpack()功能。

但你当然可以这样做:

if (std::optional<int> o = GetOptionalInt(); o) {
    // use *o here
}
Run Code Online (Sandbox Code Playgroud)

虽然额外的o检查有点多余。


如果optional<T>对最多一个元素的容器进行建模,那么这是最好的地方之一,这样您就可以执行以下操作:

for (int value : GetOptionalInt()) {
    // possibly not entered
}
Run Code Online (Sandbox Code Playgroud)

但是我们没有那个接口。

  • 我想这现在已经有效了: if (std::optional&lt;int&gt; o = GetOptionalInt()) { // 在这里使用 *o } (4认同)