在类定义内初始化具有推断维度的静态const多维数组

Initialize static const multidimensional array with inferred dimensions inside class definition

本文关键字:静态 const 数组 定义 初始化      更新时间:2023-10-16

从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的内容,而不必记得回去改变某个常量。是否有一种不同的方法允许我从声明下面的文件中的任何一点使用sizeofval ?

你的数组必须是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;
}