В С++ 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().