【发布时间】:2017-03-12 10:08:02
【问题描述】:
来自cppreference documentation for variant::variant():
当且仅当替代类型 T_0 的值初始化满足 constexpr 函数的要求时,此构造函数才是 constexpr。
上面没有提到变体中的其他类型,所以如果变体必须有一个重要的析构函数,那么声明 constexpr variant<int, string> v; 是否应该有效?
【问题讨论】:
来自cppreference documentation for variant::variant():
当且仅当替代类型 T_0 的值初始化满足 constexpr 函数的要求时,此构造函数才是 constexpr。
上面没有提到变体中的其他类型,所以如果变体必须有一个重要的析构函数,那么声明 constexpr variant<int, string> v; 是否应该有效?
【问题讨论】:
您的引用并不意味着声明 constexpr variant<int, string> v; 有效。引用 N4140(大致是 C++14 而不是 C++1z,但概念没有改变):
7.1.5 constexpr 说明符 [dcl.constexpr]
9 对象声明中使用的
constexpr说明符将对象声明为const。这样的对象应具有文字类型并应被初始化。如果它由构造函数调用初始化,则该调用应为常量表达式(5.19)。 [...]
仅仅因为构造函数调用是常量表达式而声明无效,类型也需要是文字类型。文字类型的要求之一是它们具有微不足道的析构函数。
【讨论】: