咨询C++17类内非inline静态数据成员声明与定义的歧义问题
关于C++类内静态数据成员声明/定义的疑问解答
原参考内容
标题:类定义内的非inline(C++17起)静态数据成员的声明
代码示例:
struct S { int n; // defines S::n static int i; // declares, but does not define S::i inline static int x; // defines S::x }; // defines S int S::i; // defines S::i
用户疑问
该内容存在歧义:文中提及"类定义内",但通常认为类内的声明内容多为定义,可示例中的static int i却被标注为声明而非定义。想咨询:
- 是否该成员原本是声明,自C++17起变为定义?
- 是否正确表述应为"自C++17起,非inline静态数据成员是定义而非声明"?
解答
首先明确:C++17并没有改变非inline静态数据成员在类内的性质——它们仍然只是声明,而非定义。
你混淆了不同成员的规则:
- 普通非静态数据成员(比如示例里的
int n),类内的声明就是定义,因为每个类实例都会持有该成员的实体。 - 非inline静态数据成员属于类本身,而非某个实例,所以无论C++17前后,类内的
static int i都只是声明,必须在类外补充定义(如int S::i;)才能生成对应的实体。 - C++17新增的
inline static静态数据成员是特例:这类成员在类内的声明同时就是定义,不需要额外的类外定义(示例里的inline static int x就遵循这个规则)。
所以你的两个疑问的答案是:
- 非inline静态数据成员在类内始终是声明,C++17没有将其改为定义;
- 正确表述应为:自C++17起,
inline静态数据成员在类内的声明即为定义,而非inline的静态数据成员在类内仍然只是声明,需要类外单独定义。
内容的提问来源于stack exchange,提问作者user2117840
相关产品推荐
相关产品推荐

