使用类定义中的推断维度初始化静态const多维数组

时间:2014-07-10 01:00:28

标签: c++ visual-c++ c++11 visual-studio-2013

从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

1 个答案:

答案 0 :(得分:6)

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