是否所有C++编译器都允许使用静态const int类成员变量作为数组绑定?

sha*_*oth 8 c++ static const visual-c++

在VC++中,当我需要指定一个绑定类成员变量的数组时,我这样做:

 class Class {

 private:
     static const int numberOfColors = 16;
     COLORREF colors[numberOfColors];
 };
Run Code Online (Sandbox Code Playgroud)

(请不要告诉我在这里使用std :: vector)

这样我就有了一个常量,可以用作数组绑定,稍后在类代码中指定循环语句约束,同时在其他任何地方都不可见.

问题是static const int成员变量的这种用法是仅由VC++允许还是其他广泛编译器通常允许的?

A. *_*gan 13

根据C++标准,该行为是有效的.任何最近的编译器都应该支持它


Boj*_*nik 13

这是有效的C++,大多数(所有?)合理的现代编译器都支持它.如果您使用的是boost,则可以以BOOST_STATIC_CONSTANT宏的形式获得此功能的便携支持:

class Class {
 private:
     BOOST_STATIC_CONSTANT(int, numberOfColors = 16);
     COLORREF colors[numberOfColors];
 };
Run Code Online (Sandbox Code Playgroud)

static const int numberOfColors = 16如果编译器支持此宏,则扩展为宏,否则将转向enum { numberOfColors=16 };.


sbi*_*sbi 6

十多年来,这已成为标准的C++.它甚至得到VC的支持 - 您还想要什么?(@Neil:SunCC怎么样?:^>)


Sta*_*ked 6

我相信Visual Studio 2005及更高版本支持它.XCode C++编译器(实际上是gcc).

如果你想要安全,你总是可以使用我从Effective C++学到的旧的enum hack.它是这样的:

class Class {

 private:
     enum {
        numberOfColors = 16
     };
     COLORREF colors[numberOfColors];
 };
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Mic*_*urr 4

是的,它 100% 合法并且应该是便携式的。C++ 标准在 5.19 - 常量表达式中说了这一点”(强调我的):

在一些地方,C++ 需要计算结果为整数或枚举常量的表达式:作为数组边界 (8.3.4, 5.3.4)、作为 case 表达式 (6.4.2)、作为位字段长度 (9.6)、作为枚举数初始值设定项 (7.2)、静态成员初始值设定项 (9.4.2) 以及整数或枚举非类型模板参数 (14.3)。

constant-expression:
    conditional-expression
Run Code Online (Sandbox Code Playgroud)

整型常量表达式只能涉及用常量表达式 ( 8.5)初始化的整型或枚举类型的文字 (2.13)、枚举数、const 变量或静态数据成员、整型或枚举类型的非类型模板参数以及 sizeof 表达式。

也就是说,VC6 似乎不支持它。请参阅StackedCrooked 的答案以获得良好的解决方法。事实上,我通常更喜欢enumStackedCrooked 提到的这种类型的方法。

仅供参考,“ static const”技术适用于 VC9、GCC 3.4.5 (MinGW)、Comeau 和 Digital Mars。

并且不要忘记,如果您使用“static const”成员,严格来说,除了声明之外,您还需要它的定义。然而,在这种情况下,几乎所有编译器都会让您跳过定义。