来自cppreference documentation for variant::variant():
当且仅当替代类型T_0的值初始化满足constexpr函数的要求时,此构造函数才是constexpr。
上面没有说明变体中的其他类型,如果变量必须有一个非平凡的析构函数,声明constexpr variant<int, string> v;
是否有效?
答案 0 :(得分:4)
您的引用并不意味着声明constexpr variant<int, string> v;
有效。引用N4140(大致是C ++ 14而不是C ++ 1z,但概念没有改变):
7.1.5 constexpr说明符[dcl.constexpr]
9对象声明中使用的
constexpr
说明符将对象声明为const
。这样的对象应具有文字类型并应初始化。如果它是由构造函数调用初始化的,那么该调用应该是一个常量表达式(5.19)。 [...]
声明无效只是构造函数调用是一个常量表达式,类型也必须是文字类型。文字类型的要求之一是它们具有微不足道的析构函数。