非静态数据成员的 cppreference 定义错误吗?

Rod*_*dvi 5 c++ language-lawyer

来自cppreference 的定义:

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

他们有这样的例子:

S级
{
   内部& r; // 引用类型的非静态数据成员
};

但是我们知道非静态数据成员引用不是变量,因为标准:

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

那么他们对非静态数据成员的定义是错误的(他们忘记了这个异常)?我在哪里可以找到术语“非静态数据成员”的正确定义?

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

编辑:从cppreference 对象定义和下面的讨论我们可以得出结论,非静态数据成员根本不是对象。并且cppreference 非静态成员页面更正了当前讨论的定义。

Cub*_*bbi 5

\n

所以他们对非静态数据成员的定义是错误的

\n
\n\n

是的,在数据​​成员页面的介绍性句子中使用“变量”一词是错误的(并且,正如评论中提到的,它是一个维基,维基页面上的讨论选项卡可以获得更快的反馈)。

\n\n

当前的标准措辞是3[basic]/6和 :

\n\n
\n

变量是通过声明非静态数据成员或对象的引用来引入的。变量\xe2\x80\x99的名称(如果有)表示引用或对象。

\n
\n\n

因此,参考数据成员被明确排除,要弄清楚其余部分,您需要“对象”的定义1.8[intro.object]/1

\n\n
\n

对象是通过定义 (3.1)、new 表达式 (5.3.4)、隐式更改联合的活动成员 (9.3) 或创建临时对象时 (4.4、12.2) 创建的。

\n
\n\n

最后3.1[basic.def]/2

\n\n
\n

声明是一个定义,除非...它在类定义中声明了一个非内联静态数据成员(9.2、9.2.3),

\n
\n\n

尽管变量和数据成员之间的区别似乎是不切实际的语言法律主义,但它实际上在理解编译器诊断时很重要,至少在这种情况下:

\n\n
struct X {\n    int m;\n    void f() { auto l = [m](){ return m; }; }\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

海湾合作委员会:

\n\n
error: capture of non-variable \'X::m\' \n
Run Code Online (Sandbox Code Playgroud)\n\n

铛:

\n\n
error: \'m\' in capture list does not name a variable\n
Run Code Online (Sandbox Code Playgroud)\n\n

国际商会:

\n\n
error: member "X::m" is not a variable\n
Run Code Online (Sandbox Code Playgroud)\n