有没有办法将可选的无符号变量类型转换为无符号
#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
作为参数的函数。有人可以解释为什么会出现上述问题以及我能做些什么来解决它吗?
关于第一行:
std::cout << check << std::endl;
将 std::optional
转换为其包含的值时,需要处理它为空的情况。您可以使用
std::optional::value_or
来实现:
std::cout << check.value_or(999) << std::endl;
这将输出:
200
(如果 999
为空,则输出将为
std::optional
)
关于第二行:
std::cout << check.emplace() << std::endl;
在 std::optional
中存储一个值,并返回对此值的引用。由于您没有提供任何具体值,因此将使用默认值
0
,这就是您看到的打印内容。
std::optional
有多种方法来访问它所保存的值:
std::cout << *check << std::endl;
std::cout << check.value() << std::endl;
std::cout << check.value_or(0) << std::endl;
只需确保在调用 operator bool
或
has_value()
之前使用 optional
或 operator*
方法来验证
value()
是否持有值。