在 C++17 中,新的std::optional
要求它可以轻易被破坏,如果T
在 [Optional.object.dtor] 中是可以轻易破坏的:
~optional();
1 Effects: If is_trivially_destructible_v<T> != true
and *this
包含一个值,调用val->T::~T()
.
2 Remarks: If is_trivially_destructible_v<T> == true
那么这个析构函数应该是一个普通的析构函数。
因此,这个潜在的实现片段将不符合标准:
template <class T>
struct wrong_optional {
union { T value; };
bool on;
~wrong_optional() { if (on) { value.~T(); } }
};
我的问题是:这个授权有什么好处?据推测,对于普通可破坏类型,编译器可以计算出value.~T()
是一个无操作并且不发出任何代码wrong_optional<T>::~wrong_optional()
.
std::optional
已经有constexpr构造函数 http://en.cppreference.com/w/cpp/utility/optional/optional。当它的析构函数很平凡时,它是一个文字类型 https://en.cppreference.com/w/cpp/named_req/LiteralType。只能在常量表达式中创建和操作文字类型的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)