从 C++11 开始,可以在类定义中初始化 static 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 的内容,而不必记得返回并在某处更改常量。是否有一种不同的方法可以让我在声明下方的文件中的任何位置对 val
使用 sizeof
?
最佳答案
您的数组必须是 constexpr(clang 和 gcc 在它们的错误消息中指定它):
class B {
public:
static constexpr const unsigned int val[][2] = { { 0, 1 } };
// ^^^^^^^^
};
看到它工作 here .
Visual Studio CTP 2013 (一个“beta”版本,在生产中应该避免)提供对 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;
}
关于c++ - 使用类定义中的推断维度初始化静态常量多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24665959/