是否可以在C++的类中初始化静态常量成员对象?
问题描述:
是否可以在类定义中初始化静态常量成员?请参阅下面的代码,是否可以在C++的类中初始化静态常量成员对象?
class foo
{
public:
foo(int p) : m_p(p){}
~foo(){}
private:
int m_p;
};
class bar
{
public:
bar(){}
~bar(){}
public:
static const foo m_foo = foo(2); //is this possible?
};
非常感谢。
答
简短回答:
不,直到静态成员是const并且是整型或枚举类型。
龙答:
$ 9.4.2/4 - “如果一个静态数据成员是const的整体或常量枚举 型 ,其在类 定义声明可以指定一个 常数初始化这应是一个 积分常量表达式(5.19)。 在这种情况下,该构件可以出现在 积分常量表达式。该 构件应仍处于 命名空间范围来限定,如果它是在 编程的,用于m和名称空间范围 定义不应包含 初始值设定项。“
答
不适用于类类型的静态数据成员,如您的示例中所示。
9.4.2/2:
静态数据的声明 成员在其类定义不 定义...静态数据成员应在 命名空间中出现 的定义范围包括成员的 类定义。
9.4.2/4:
如果静态数据成员是常量 积分或const枚举类型的,其 在类定义 声明可以指定一个 恒定初始化内容应是一个 积分常量表达式(5.19)。 在这种情况下,成员可以出现在 积分常量表达式中。如果在 程序中使用,并且名称空间范围 定义中不包含 初始值设定项,则 成员仍应在 名称空间范围内定义。