В С++ 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()
является no-op и не испускает код для wrong_optional<T>::~wrong_optional()
.