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

Nmd*_*ery 4 c++ visual-c++ c++11 visual-studio-2013

从C++ 11开始,可以在类定义中初始化静态const内置类型,如下所示:

class A {
public:
    static const unsigned int val = 0; //allowed
};
Run Code Online (Sandbox Code Playgroud)

但是,在带有数组的Visual C++ 2013中执行此操作会给我一个错误,告诉我这是不允许的:

class B { 
public:
    static const unsigned int val[][2] = { { 0, 1 } }; //not allowed
};
Run Code Online (Sandbox Code Playgroud)

错误消息只是读取"类型为const unsigned int [] [2]的成员不能有类内初始化程序." 相反,我被迫做以下事情:

class C {
public:
    static const unsigned int val[][2];
};

const unsigned int C::val[][2] = { { 0, 1 } };
Run Code Online (Sandbox Code Playgroud)

这是不幸的,因为我的代码依赖于val的大小,我希望能够更改val的内容,而不必记住返回并在某处更改常量.是否有这样做的不同的方式,让我使用sizeofval任何点声明下面的文件吗?

qua*_*dev 6

你的数组必须是constexpr(clang和gcc在错误消息中指定它):

class B { 
public:
    static constexpr const unsigned int val[][2] = { { 0, 1 } };
    //     ^^^^^^^^
};
Run Code Online (Sandbox Code Playgroud)

看到它在这里工作.

Visual Studio CTP 2013("beta"版本,应该避免生产)提供支持constepxr,也应该在将来的版本中提供.

编辑:

如果您的编译器不支持constexpr(希望对您而言,不会太久),那么您无法对静态数组进行类内初始化,并且必须采用旧方法:

class C {
public:
    static const unsigned int val[][2];
};

const unsigned int C::val[][2] = { { 0, 1 } };
Run Code Online (Sandbox Code Playgroud)

如果您的数组类型已完成(如果您声明所有数组维度),则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;
}
Run Code Online (Sandbox Code Playgroud)

  • @quantdev CTP未获得生产使用许可,甚至没有使用此类业余爱好.它们仅被许可用于测试用途.因此,这不是一个答案. (2认同)