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的内容,而不必记住返回并在某处更改常量.是否有这样做的不同的方式,让我使用sizeof
在val
任何点声明下面的文件吗?
你的数组必须是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)