【发布时间】:2017-06-13 08:07:20
【问题描述】:
在 C++17 中,新的 std::optional 规定如果 T 在 [optional.object.dtor] 中可简单破坏,则它可简单破坏:
~optional();
1 效果:如果is_trivially_destructible_v<T> != true和*this包含一个值,则调用val->T::~T()。
2 备注:如果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::vector的破坏?)。
标签: c++ destructor c++17