【问题标题】:Do we still need to separately define static members, even if they are initialised inside the class definition?我们是否还需要单独定义静态成员,即使它们是在类定义中初始化的?
【发布时间】:2013-04-24 11:27:39
【问题描述】:

在 C++03 中,我们能够在类定义 but still had to define the memberif it were to be odr-used 内内联初始化 const static 类数据成员。

C++11 还是这样吗?

struct Foo
{
   static const int x = 3;
};

const int Foo::x;
// ^ required?

【问题讨论】:

    标签: c++ c++11 language-lawyer


    【解决方案1】:

    是的。

    [C++11: 9.4.2/3]: 如果一个非易失的conststatic数据成员是整数或枚举类型,它在类定义中的声明可以指定一个brace-or-equal-initializer em> 其中每个 initializer-clause 是一个 assignment-expression 是一个常量表达式 (5.19)。可以在类定义中使用 constexpr 说明符声明文字类型的 static 数据成员;如果是这样,它的声明应指定一个 brace-or-equal-initializer,其中作为 assignment-expression 的每个 initializer-clause 都是一个常量表达式。 [ 注意: 在这两种情况下,成员都可能出现在常量表达式中。 —结束注释] 如果该成员在程序中被 odr-used (3.2) 使用,则该成员仍应在命名空间范围内定义,并且命名空间范围定义不应包含 initializer.

    这相当于C++03中的措辞:

    [C++03: 9.4.2/2]:如果静态数据成员是const整数或const枚举类型,它在类定义中的声明可以指定一个constant-initializer,它应该是一个整数常量表达式(5.19)。在这种情况下,成员可以出现在整型常量表达式中。如果在程序中使用该成员,则该成员仍应在命名空间范围内定义,并且命名空间范围定义不应包含 initializer

    如您所见,除了为constexpr 引入规则之外,规则本身并没有改变。

    【讨论】:

    • odr-used 的定义也发生了变化,这可能会影响需要定义哪些成员。
    • @DaveS:好点。 las,两者中 odr-used 的各自定义(实际上 C++03 将其称为“潜在评估”)太复杂而无法注入此答案。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多