我们是否仍然需要单独定义静态成员,即使它们是在类定义中初始化的
Do we still need to separately define static members, even if they are initialised inside the class definition?
在 C++03 中,我们能够在类定义中内联初始化const
static
类数据成员,但如果要使用 odr 来定义成员,我们仍然必须定义该成员。
C++11 仍然如此吗?
struct Foo
{
static const int x = 3;
};
const int Foo::x;
// ^ required?
是的。
[C++11: 9.4.2/3]:
如果非易失性const
static
数据成员是整型或枚举类型,则其在类定义中的声明可以指定大括号或等于初始值设定项,其中作为赋值表达式的每个初始值设定项子句都是常量表达式 (5.19(。可以使用constexpr
说明符在类定义中声明文本类型的static
数据成员;如果是这样,则其声明应指定一个大括号或等于初始值设定项,其中作为赋值表达式的每个初始值设定项子句都是常量表达式。[ 注意:在这两种情况下,成员都可能出现在常量表达式中。—尾注 ]如果在程序中使用 (3.2( 的成员,则仍应在命名空间作用域中定义该成员,并且命名空间作用域定义不应包含初始值设定项。
这与 C++03 中的措辞相当:
[C++03: 9.4.2/2]:
如果静态数据成员是整const
或const
枚举类型,则其在类定义中的声明可以指定一个常量初始值设定项,该初始值设定项应为整型常量表达式 (5.19(。在这种情况下,成员可以出现在整型常量表达式中。如果在程序中使用该成员,则仍应在命名空间作用域中定义该成员,并且命名空间作用域定义不应包含初始值设定项。
如您所见,规则本身根本没有改变,除了引入constexpr
规则之外。
相关文章:
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- Boost Python Numpy - 要初始化的未定义引用
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- C++类中的类作为自定义向量(如何初始化?
- 初始化类定义中的结构数组
- C++ 如何检查 char 变量是否未定义(未初始化)
- C++列表初始化允许多个用户定义的转换
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- (C++)我的自定义数组无法初始化(编译错误)
- 类模板静态数据成员定义/声明/初始化
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 在另一个文件中初始化的 extern 数组中未定义的引用
- thread_local静态成员模板定义:初始化失败,GCC
- 通过用户定义的转换初始化引用
- 自定义初始化数组与 std::make_unique
- C++具有自定义初始化的静态调度
- 导入错误:动态模块未定义初始化函数
- 有没有一种标准的方法可以在初始化阶段运行一些代码并定义初始化的顺序
- C++,为什么我不能把带有参数的类构造函数的定义-初始化列表放在类声明之外
- 是否需要在头文件中定义初始化列表