cppreference的定义:
非静态数据成员是在类的成员规范中声明的变量。
他们有例子:
class S { int& r; // non-static data member of reference type };
但我们知道,由于标准
,非静态数据成员引用不是变量§3/ 6:变量是由非静态数据成员或对象以外的引用声明引入的。
所以他们对非静态数据成员的定义是错误的(他们忘记了这个例外)?我在哪里可以找到“非静态数据成员”一词的正确定义?
不幸的是我在C ++标准中找不到非静态数据成员的定义。
编辑:从cppreference object definition和下面的讨论中我们可以得出结论,非静态数据成员根本不是对象。而cppreference non-static member page目前正在纠正所讨论的定义。
答案 0 :(得分:1)
所以他们对非静态数据成员的定义是错误的
是的,在数据成员页面的介绍性句子中使用“变量”一词是错误的(并且,如评论中提到的,它是一个维基,维基页面上的讨论标签得到更快的反馈)。
目前的标准措辞是3[basic]/6
和:
变量是由非静态数据成员或对象以外的引用声明引入的。变量的名称(如果有)表示引用或对象。
因此,明确排除参考数据成员,并找出其余部分,您需要从1.8[intro.object]/1
当隐式更改并集的活动成员(9.3)或创建临时对象时,由定义(3.1),new-expression(5.3.4)创建对象(4.4,12.2)
最后3.1[basic.def]/2
声明是一个定义,除非......它在类定义(9.2,9.2.3)中声明了非内联静态数据成员,
虽然看起来变量和数据成员之间的区别似乎是不切实际的语言 - 律师主义,但在理解编译器诊断时,这实际上很重要,至少在这种情况下:
struct X {
int m;
void f() { auto l = [m](){ return m; }; }
};
GCC
error: capture of non-variable 'X::m'
铛:
error: 'm' in capture list does not name a variable
ICC:
error: member "X::m" is not a variable