非静态数据成员及其在cppreference

时间:2016-12-14 16:54:27

标签: c++

cppreference的定义:

  

非静态数据成员是在类的成员规范中声明的变量。

他们有例子:

class S
{
   int& r;               // non-static data member of reference type
};

但我们知道,由于标准

,非静态数据成员引用不是变量
  

§3/ 6:变量是由非静态数据成员或对象以外的引用声明引入的。

所以他们对非静态数据成员的定义是错误的(他们忘记了这个例外)?我在哪里可以找到“非静态数据成员”一词的正确定义?

不幸的是我在C ++标准中找不到非静态数据成员的定义。

编辑:从cppreference object definition和下面的讨论中我们可以得出结论,非静态数据成员根本不是对象。而cppreference non-static member page目前正在纠正所讨论的定义。

1 个答案:

答案 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