Rod*_*dvi 5 c++ language-lawyer
来自cppreference 的定义:
非静态数据成员是在类的成员规范中声明的变量。
他们有这样的例子:
S级
{
内部& r; // 引用类型的非静态数据成员
};
但是我们知道非静态数据成员引用不是变量,因为标准:
§3/6:变量是由非静态数据成员或对象以外的引用声明引入的。
那么他们对非静态数据成员的定义是错误的(他们忘记了这个异常)?我在哪里可以找到术语“非静态数据成员”的正确定义?
不幸的是,我在 C++ 标准中找不到非静态数据成员的定义。
编辑:从cppreference 对象定义和下面的讨论我们可以得出结论,非静态数据成员根本不是对象。并且cppreference 非静态成员页面更正了当前讨论的定义。
\n\n\n所以他们对非静态数据成员的定义是错误的
\n
是的,在数据成员页面的介绍性句子中使用“变量”一词是错误的(并且,正如评论中提到的,它是一个维基,维基页面上的讨论选项卡可以获得更快的反馈)。
\n\n当前的标准措辞是3[basic]/6和 :
\n\n\n变量是通过声明非静态数据成员或对象的引用来引入的。变量\xe2\x80\x99的名称(如果有)表示引用或对象。
\n
因此,参考数据成员被明确排除,要弄清楚其余部分,您需要“对象”的定义1.8[intro.object]/1
\n\n\n对象是通过定义 (3.1)、new 表达式 (5.3.4)、隐式更改联合的活动成员 (9.3) 或创建临时对象时 (4.4、12.2) 创建的。
\n
最后3.1[basic.def]/2
\n\n\n声明是一个定义,除非...它在类定义中声明了一个非内联静态数据成员(9.2、9.2.3),
\n
尽管变量和数据成员之间的区别似乎是不切实际的语言法律主义,但它实际上在理解编译器诊断时很重要,至少在这种情况下:
\n\nstruct X {\n int m;\n void f() { auto l = [m](){ return m; }; }\n};\nRun Code Online (Sandbox Code Playgroud)\n\n海湾合作委员会:
\n\nerror: capture of non-variable \'X::m\' \nRun Code Online (Sandbox Code Playgroud)\n\n铛:
\n\nerror: \'m\' in capture list does not name a variable\nRun Code Online (Sandbox Code Playgroud)\n\n国际商会:
\n\nerror: member "X::m" is not a variable\nRun Code Online (Sandbox Code Playgroud)\n