在类定义内初始化具有推断维度的静态const多维数组
Initialize static const multidimensional array with inferred dimensions inside class definition
从c++ 11开始,可以在类定义中初始化静态const内置类型,如下所示:
class A {
public:
static const unsigned int val = 0; //allowed
};
然而,在Visual c++ 2013中使用数组执行此操作会给我一个错误,告诉我这是不允许的:
class B {
public:
static const unsigned int val[][2] = { { 0, 1 } }; //not allowed
};
错误信息简单地读为"const unsigned int[][2]类型的成员不能有类内初始化式"。相反,我被迫执行以下操作:
class C {
public:
static const unsigned int val[][2];
};
const unsigned int C::val[][2] = { { 0, 1 } };
这是不幸的,因为我的代码依赖于val的大小,我希望能够改变val的内容,而不必记得回去改变某个常量。是否有一种不同的方法允许我从声明下面的文件中的任何一点使用sizeof
对val
?
你的数组必须是constexpr (clang和gcc在错误消息中指定了它):
class B {
public:
static constexpr const unsigned int val[][2] = { { 0, 1 } };
// ^^^^^^^^
};
看它在这里工作
Visual Studio CTP 2013(一个"测试版",应该避免用于生产)提供了对constepxr
的支持,这也应该在未来的版本中可用。
如果你的编译器不支持constexpr
(希望对你来说,不要太久),那么你不能做静态数组的类内初始化,必须做旧的方式:
class C {
public:
static const unsigned int val[][2];
};
const unsigned int C::val[][2] = { { 0, 1 } };
如果你的数组类型是完整的(如果你声明了所有的数组维度),那么sizeof
可以被应用(编译器知道需要多少元素):
class C {
public:
static const unsigned int val[2][2]; // Specify all dimensions.
void foo() { cout << sizeof(C::val); } // OK
};
const unsigned int C::val[][2] = { { 0, 1 } , { 2, 3 } };
int main() {
C c;
c.foo();
return 0;
}
相关文章:
- 初始化类中的静态 const 数组 - C++
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 匿名命名空间中的const与静态const
- 内联初始化的静态 const 类成员的初始化顺序保证
- 是否可以按模板类型更改静态 const 类成员的值
- 如何在类中声明静态 const 结构元素
- 与其他静态const成员初始化静态常量成员
- 如何在预处理器 (#if) 中强制转换静态 const 以避免溢出
- 使用模板参数初始化静态 const 成员
- 为什么将FMTFLAG指定两次 - 作为枚举的一部分,而另一个实例为静态const变量
- 将整数值分配为variadic模板列表到静态const std ::数组成员
- 静态const数据成员在另一个文件中定义
- 初始化在 C++ 中自定义类的构造函数中没有参数的静态 const 类成员
- 将静态 const 成员重新声明为 constexpr 是否会自动使其符合内联条件
- constexpr vs.静态const:哪个更喜欢
- 静态const颜色无法与Allegro5完全合作
- 模板类中的不可复制静态 const 成员类
- 编组静态const char*从C 到C#
- 枚举和静态const成员变量在模板特征类中的用法
- 在性能和内存使用方面,“静态const”,“ #define”和“枚举”之间的差异