是否可以在C++的类中初始化静态常量成员对象?

是否可以在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)。 在这种情况下,成员可以出现在 积分常量表达式中。如果在 程序中使用,并且名称空间范围 定义中不包含 初始值设定项,则 成员仍应在 名称空间范围内定义。