Pau*_*aul 5 c++ language-lawyer stdoptional
查看以下代码作为示例:
#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();
}
Run Code Online (Sandbox Code Playgroud)
我最终得到了类似的东西,并且惊讶地发现它a在构造函数中没有价值。这可能是一件好事,因为该对象尚未完全构建并且我的设计可以改进。但我没有在 cppreference 中找到任何关于它应该按照标准表现的证据。
所以我的问题是(主要是出于好奇):上面示例代码中的输出应该是什么,是指定的还是实现定义的(或 UB)?
有趣的是,上面的代码打印(剧透):
010对于 GCC 和 Cland,以及011MSVC。
据我所知,当前的标准草案(由https://timsong-cpp.github.io/cppwp/提供)提供)并不明确,但 MSVC 行为对我来说是指定的行为(无论它是销毁期间理想的一个是值得怀疑的):
\n首先emplace包含以下文本
\n\n效果:调用 *this = nullopt。然后直接非列表初始化包含的值 std\xe2\x80\x8b::\xe2\x80\x8bforward\xe2\x80\x8b(args)....
\n...
\n评论:如果在调用 T 的构造函数期间抛出异常,则 *this 不包含值,并且之前的 *val(如果有)已被销毁。
\n
根据 nullopt 分配将 has_value 设置为 false,然后在构造过程中将 has_value 设置为 true(未指定该操作时),最后在构造失败并出现异常时将其重置,这将是一种反常的解读。
\n销毁时的行为是这样的:
\n\n\n效果:如果 is_\xc2\xadtrivially_\xc2\xaddestructible_\xc2\xadv != true 并且 *this 包含一个值,则调用 val->T::~T()
\n
没有提到任何变化has_value,如果需要指定它会按顺序进行。
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |