【问题标题】:Initialization check for std::optionalstd::optional 的初始化检查
【发布时间】:2021-06-04 18:23:04
【问题描述】:

我一直想知道比较 optional 值的值的后果,这是我们保证初始化的值。

举个例子:

std::optional<int> test;
test = 2;
if (test > 1)
  std::cout<<test.value();

我已经在本地运行并执行了这个案例,它打印出2。我的问题是,如何评估这个表达式?我从&lt;optional&gt; 标头的源代码中了解到operator() 被重载以返回bool,指示optional 对象是否已初始化。但这仍然不能解释我们是如何在if 块中输入代码的,因为我从未检查过test.value &gt; 1 之类的东西。

这是我提到的重载operator()的链接:

https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/optional#L937

【问题讨论】:

  • 您链接的文件中的第 1064 行,而不是查看实现,我建议先查阅一些参考资料。

标签: c++ optional


【解决方案1】:

std::optional 实现了一个operator&gt;,它将两个optional 对象相互比较:

template< class T, class U >
constexpr bool operator>( const optional<T>& lhs, const optional<U>& rhs );

std::optional 可以从一个值隐式构造。由于这个 operator&gt; 的输入采用 const 引用,编译器能够从整数文字 1 构造一个 临时 std::optional&lt;int&gt; 对象,并将其与您的 test 变量进行比较。

【讨论】:

  • 而 std::optional 可以从 T 值隐式构造 它实际上是有条件显式的。此技术不适用于具有显式构造函数的类型。
  • 所以,除了我对现代 C++ 的初步理解之外,如果类型 T 具有显式构造函数,那么这样的代码在编译过程中会失败,对吧?
  • @AzizThanawala 是的,在这种情况下,您需要改用 if (test &gt; optional&lt;T&gt;(value)),其中 T 是所需的类型,valueT 的所需值。
猜你喜欢
  • 2018-04-07
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2016-12-22
  • 2013-03-22
  • 1970-01-01
相关资源
最近更新 更多