1

是否可以在类定义中初始化静态常量成员?请参阅下面的代码,

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?
};

非常感谢。

4

2 回答 2

4

简短的回答:

不,直到静态成员是 const 并且是整数或枚举类型。

长答案:

$9.4.2/4 - “如果一个静态数据成员是 const 整数或 const 枚举类型,它在类定义中的声明可以指定一个常量初始化器,它应该是一个整数常量表达式 (5.19)。在这种情况下,成员可以出现在整型常量表达式中。如果在程序中使用该成员,则该成员仍应在命名空间范围内定义,并且命名空间范围定义不应包含初始值设定项。

于 2010-11-03T03:27:22.767 回答
3

不适用于类类型的静态数据成员,例如您的示例。

9.4.2/2:

静态数据成员在其类定义中的声明不是定义……静态数据成员的定义应出现在包含该成员的类定义的命名空间范围内。

9.4.2/4:

如果静态数据成员是 const 整数或 const 枚举类型,它在类定义中的声明可以指定一个常量初始化器,它应该是一个整数常量表达式 (5.19)。在这种情况下,成员可以出现在整型常量表达式中。如果在程序中使用该成员,则该成员仍应在名称空间范围内定义,并且名称空间范围定义不应包含初始值设定项。

于 2010-11-03T03:29:52.910 回答