Bar*_*rry 15 c++ destructor c++17
在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(); } }
};
Run Code Online (Sandbox Code Playgroud)
我的问题是:这项任务的优势是什么?据推测,对于简单的可破坏类型,编译器可以发现这value.~T()是一个无操作并且不会发出代码wrong_optional<T>::~wrong_optional().
一种可以轻易破坏的类型是它自己的奖励.以下是使用简单析构函数的一些优点:
该类型可以轻易地复制.这使得该类型有资格进行各种优化.Visual Studio的标准库实现有许多优化来处理这些类型.
不打扰调用易碎的类型的析构函数是合法的.您只需取消分配存储空间即可.这是一种低级别的事情,但它可以有优势.它是实现上述优化的部分原因.
具有普通析构函数的类型可以是文字类型,因此是可以在编译时构造和操作的对象.
optional<T>的界面试图尽可能不干扰行为T.所以,如果你可以做一些事情T,那么你应该能够做同样的事情optional<T>.除非有一个非常好的理由不这样做.
| 归档时间: |
|
| 查看次数: |
1578 次 |
| 最近记录: |