Kno*_*abe 20 c++ static-members constexpr c++11
在类定义中初始化静态整型数据成员可以声明const或constexpr,但在类定义中初始化非整数的静态数据成员必须是constexpr:
class MyClass {
static const int w = 5; // okay
static constexpr int x = 5; // okay
static const float y = 1.5; // error!
static constexpr float z = 1.5; // okay
};
Run Code Online (Sandbox Code Playgroud)
有人知道为什么不允许y的声明吗?标准中将其定为非法的部分是9.4.2/3,但为什么它是非法的?
在 C++11 之前,您无法在类声明中初始化非整型/枚举类型的静态成员(但可以在类声明之外)。管理规则constexpr继承了这一点,但允许您在类声明中使用它来初始化它constexpr(因此您不再需要如下代码):
struct A
{
static const float pi;
};
const float A::pi = 3.1415;
Run Code Online (Sandbox Code Playgroud)
该规则的副作用之一是简化类结构而不是使其变得丑陋(如上面的代码)。
在 C++11 添加之前出现这种情况的原因之一constexpr是标准没有指定如何实现浮点(它留给处理器/架构 - 例如,当你说 时float x = 1.6f,它实际上是1.6000000000024在大多数系统上)。
| 归档时间: |
|
| 查看次数: |
6658 次 |
| 最近记录: |