在 C++11 和 C++14 中,为什么我需要constexpr
在下面的代码片段中:
class Foo {
static constexpr double X = 0.75;
};
而这会产生编译器错误:
class Foo {
static const double X = 0.75;
};
并且(更令人惊讶的是)编译时没有错误?
class Foo {
static const double X;
};
const double Foo::X = 0.75;
在C++03中,我们只允许为枚举类型的const整型的静态成员变量提供类内初始化器,在C++11中,我们可以使用constexpr在类中初始化文字类型的静态成员。 C++11 中对 const 变量保留了此限制,主要是为了与 C++03 兼容。我们可以从已关闭问题 1826:常量表达式中的 const 浮点 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1826其中说:
用常量初始化的 const 整数可以在常量表达式中使用,但用常量初始化的 const 浮点变量则不能。这是有意为之,以便与 C++03 兼容,同时鼓励一致使用 constexpr。然而,有些人发现这种区别令人惊讶。
CWG 最终关闭了该请求,因为该请求并非缺陷(NAD),基本上是说:
希望浮点值参与常量表达式的程序员应该使用 constexpr 而不是 const。
以供参考N1804
与 C++03 最接近的标准草案可在 章节中公开获取9.4.2
[类.静态.数据] says:
如果静态数据成员是 const 整型或 const 枚举类型,则其在类定义中的声明可以
指定一个常量初始化器,它应该是一个整型常量表达式(5.19)。在这种情况下,该成员可以出现
在整型常量表达式中。如果在程序中使用该成员,并且该成员仍应在命名空间范围内定义,并且
命名空间范围定义不应包含初始值设定项。
以及 C++11 标准部分草案9.4.2
[类.静态.数据] says:
如果非易失性 const 静态数据成员是整型或枚举类型,则其在类中的声明
定义可以指定一个大括号或等于初始化器,其中每个初始化器子句都是赋值表达式
是一个常数表达式 (5.19)。可以在中声明文字类型的静态数据成员
使用 constexpr 说明符进行类定义;如果是这样,其声明应指定大括号或等于初始化程序
其中作为赋值表达式的每个初始值设定项子句都是常量表达式。 [...]
这与 C++14 标准草案中的内容几乎相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)