C++ 使用类定义内的推断维度初始化静态常量多维数组

C++ 使用类定义内的推断维度初始化静态常量多维数组,c++,visual-c++,c++11,visual-studio-2013,C++,Visual C++,C++11,Visual Studio 2013,从C++11开始,可以在类定义中初始化静态常量内置类型,如下所示: class A { public: static const unsigned int val = 0; //allowed }; 但是,用VisualC++ 2013用数组来做这件事,会给我一个错误,告诉我这是不允许的: class B { public: static const unsigned int val[][2] = { { 0, 1 } }; //not allowed }; 错误消息只是读

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

class A {
public:
    static const unsigned int val = 0; //allowed
};

但是,用VisualC++ 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

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

看到它工作

(一个“beta”版本,应该避免用于生产)提供了对
constepxr
的支持,该版本也应该在将来的版本中提供

编辑:

如果您的编译器不支持
constexpr
(希望对您来说,不要太久),那么您就不能对静态数组进行类内初始化,必须采用旧方法:

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

const unsigned int C::val[][2] = { { 0, 1 } };
如果数组类型完整(如果声明所有数组维度),则可以应用
sizeof
(编译器知道需要多少元素): ;

C类{
公众:
static const unsigned int val[2][2];//指定所有维度。

void foo(){很遗憾visual studio还不支持constexpr关键字。VS2013 CTP有:,你应该升级你的。关于上述评论,可能与决定你是否喜欢使用CTP有关。我不一定要告诉OP他“应该”升级,因为CTP不保证发布质量,并且可能会发生更改(这在理论上可能会导致在使用未来版本时出现问题)。@NmdMystrey:“社区技术预览(CTP)”是Visual Studio下一个主要版本的早期预发布版本。CTP为早期采用者提供了一个尝试新的和改进的产品功能的机会,并能够与产品团队共享反馈。”@quantdev CTP未获得生产使用许可,甚至未获得业余使用许可。它们仅获得测试使用许可。因此,这不是答案。因此,将常量替换为实际获得
val
大小的表达式。
class C {
public:
    static const unsigned int val[][2];
};

const unsigned int C::val[][2] = { { 0, 1 } };
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;
}