请查看以下代码作为一个例子:
#include <iostream>
#include <optional>
class A {
public:
A();
~A();
};
std::optional<A> a;
A::A() { std::cout << a.has_value(); }
A::~A() { std::cout << a.has_value(); }
int main() {
a.emplace();
std::cout << a.has_value();
}
我最终得到了类似的东西,惊讶地发现构造函数中
a
没有值。这可能是件好事,因为对象没有完全构建完成,我的设计可以改进。但是我在cppreference中没有找到任何关于它应该按标准如何运行的证据。
所以我的问题是(主要是出于好奇):上面的示例代码应该输出什么,并且是指定的还是实现定义(或UB)?
有趣的是,上面的代码打印出(剧透):
对于GCC和Cland,为010
,对于MSVC为011
。
A::A()
完成,才会有一个A
。如果A::A()
抛出异常,那么a
从未持有过值。我不确定是否已经指定了这一点,但这是我直觉上期望的行为,也是最容易实现的行为。我只期望在emplace
返回后has_value
为true
。此外,在emplace
返回之前可能无法调用a.value()
,支持has_value
应始终为false
。 - François Andrieux