变种<int,string =“”>可以是constexpr吗?

时间:2017-03-12 10:08:02

标签: c++ c++17 variant

来自cppreference documentation for variant::variant()

  

当且仅当替代类型T_0的值初始化满足constexpr函数的要求时,此构造函数才是constexpr。

上面没有说明变体中的其他类型,如果变量必须有一个非平凡的析构函数,声明constexpr variant<int, string> v;是否有效?

1 个答案:

答案 0 :(得分:4)

您的引用并不意味着声明constexpr variant<int, string> v;有效。引用N4140(大致是C ++ 14而不是C ++ 1z,但概念没有改变):

  

7.1.5 constexpr说明符[dcl.constexpr]

     

9对象声明中使用的constexpr说明符将对象声明为const。这样的对象应具有文字类型并应初始化。如果它是由构造函数调用初始化的,那么该调用应该是一个常量表达式(5.19)。 [...]

声明无效只是构造函数调用是一个常量表达式,类型也必须是文字类型。文字类型的要求之一是它们具有微不足道的析构函数。