为什么不带参数的 `emplace()` 返回 0,我们可以用它来读取 `std::Optional<unsigned>` 变量吗? [重复]

问题描述 投票:0回答:2

有没有办法将typecast可选的无符号

std::optional<unsigned>
变量转换为无符号?

#include <optional>
#include <iostream>

int main()
{

    std::optional<unsigned> check = 200;
 
    std::cout << check << std::endl;
    std::cout << check.emplace() << std::endl;
    
    return 0;
}

在上面的函数中,当我尝试打印

check
(可选变量)时,出现以下错误:

main.cpp: In function ‘int main()’:
main.cpp:15:15: error: no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream’} and ‘std::optional’)
   15 |     std::cout << check << std::endl;
      |     ~~~~~~~~~ ^~ ~~~~~
      |          |       |
      |          |       std::optional<unsigned int>
      |          std::ostream {aka std::basic_ostream<char>}

下面是我尝试使用 emplace 打印时的结果,因为

check.emplace()
是:

#include <optional>
#include <iostream>

int main()
{

    std::optional<unsigned> check = 200;
 
    // std::cout << check << std::endl;
    std::cout << check.emplace() << std::endl;
    
    return 0;
}

结果:

0


...Program finished with exit code 0
Press ENTER to exit console.

上面的例子只是为了演示我的问题。我的实际程序有

std::optional<unsigned> check
因为它是可选的默认参数。当用户传递不同的参数时,我想将
arg
传递给以
unsigned
作为参数的函数。

这些帖子: 移动可选变量的值使用流和模板取出值使用可选讨论上述主题。简而言之,他们都没有解释如何打印获取

optional variable
的值。

有人可以解释一下上述问题以及我可以做些什么来解决它吗?

c++ casting option-type stdoptional
2个回答
6
投票

std::optional
有多种方法来访问它所保存的值:

operator*

std::cout << *check << std::endl;

value()

std::cout << check.value() << std::endl;

value_or()

std::cout << check.value_or(0) << std::endl;

只需确保在调用 operator bool

has_value() 之前使用
optional
operator*
 方法来验证 
value()
是否持有值。


5
投票

关于第一行:

std::cout << check << std::endl;

std::optional
转换为其包含的值时,需要处理它为空的情况。
您可以使用
std::optional::value_or
来实现这一点。
std::optional::value_or
返回
std::optional
中的值(如果有),或者如果
std::optional
为空,则将该值作为参数传递给
value_or

std::cout << check.value_or(999) << std::endl;

这将输出:

200

(如果

999
为空,则输出将为
std::optional

如果您确定

optional
不为空(您可以使用
operator bool
has_value
方法来检查这一点),您还可以使用
operator*
或使用 来获取其中包含的值
value
方法:

if (check)  // or `if (check.has_value())`
{
    std::cout << *check << std::endl;    
    std::cout << check.value() << std::endl;    
}

关于第二行:

std::cout << check.emplace() << std::endl;

std::optional::emplace
std::optional
中构造一个值,并返回对此值的引用。
不带任何参数调用
emplace
会以类似于以下方式构造
unsigned

unsigned a{};

这使用了值初始化,对于像

unsigned
这样的简单类型,这实际上是零初始化
这就是您看到打印的
0
的原因。

现场演示(双线)

© www.soinside.com 2019 - 2024. All rights reserved.