зачем объявлять конструкторы constrexpr для классов с нетривиальными деструкторами (например, unique_ptr, std :: variable)
Насколько я понимаю (по крайней мере, дляc++14
Деструктор не может бытьconstexpr
если это не тривиально (неявно сгенерированный или=default
). Какой смысл декларироватьconstexpr
конструкторы для структур с нетривиальными деструкторами?
struct X {
int a_;
constexpr X(int a) : a_{a} {}
// constexpr ~X(){}; // Error dtor cannot be marked constexpr
// ~X(){}; // causes error at y declaration: temporary of non-literal type ‘X’
// in a constant expression .
};
template <int N> struct Y {};
int main() {
Y<X{3}.a_> y; // OK only if the destructor is trivial
(void)y;
}
// tested with c++14 g++-5.1.0 and clang++ 3.5.0
Напримерstd::unique_ptr
имеет некоторыеконструкторы constexpr
(по умолчанию иnullptr_t
), хотя деструктор явно задан явно (уверен, что он не имеет эффекта, если объектnullptr
, но это не значит, что у него все еще есть явно определенный деструктор, чтобы проверить, находится ли объект в пустом состоянии, и, как я видел, даже пустой деструктор не позволяет использовать объект в выражение константы компиляции)
Другим примером является предложение останд :: вариант: в нем есть почти все конструкторыconstexpr
хотя деструктор имеет подпись~variant()
и это должноcall get<T_j> *this).T_j::~T_j() with j being index().
Что мне не хватает?