从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
?
答案 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;
}