C++ 非静态数据成员的cppreference定义是否错误?

C++ 非静态数据成员的cppreference定义是否错误?,c++,language-lawyer,C++,Language Lawyer,定义来自: 非静态数据成员是在类的成员规范中声明的变量 他们有这样的例子: class S { int& r; // non-static data member of reference type }; S类 { int&r;//引用类型的非静态数据成员 }; 但我们知道,由于以下标准,非静态数据成员引用不是变量: §3/6:变量是通过声明非静态数据成员或对象以外的引用引入的 那么,他们对非静态数据成员的定义是否错误(他们忘记了这个异常)?在哪里可以找到术语“

定义来自:

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

他们有这样的例子:

class S { int& r; // non-static data member of reference type }; S类 { int&r;//引用类型的非静态数据成员 }; 但我们知道,由于以下标准,非静态数据成员引用不是变量:

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

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

遗憾的是,我在C++标准中找不到非静态数据成员的定义。 编辑:通过下面的讨论,我们可以得出结论,非静态数据成员根本不是对象。并更正了目前讨论的定义

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

是的,在data members页面的介绍性语句中使用“variable”一词是错误的(而且,正如评论中提到的,这是一个wiki,wiki页面上的讨论选项卡获得更快的反馈)

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

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

因此,引用数据成员被明确排除在外,为了弄清其余部分,您需要从
1.8[intro.object]/1

通过定义(3.1)、新表达式(5.3.4)、隐式更改联合的活动成员(9.3)或创建临时对象(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; }; }
};
通用条款:

叮当声:

error: 'm' in capture list does not name a variable
国际商会:


如果将
r
声明为非静态类成员,那么它仍然是非静态成员变量。它只是一个引用了其他内容的变量。如果你把这个定义定义为“正常”函数局部变量,你还会说它不是变量吗?@某个程序员的C++标准说它不是真的。非引用的非静态数据成员定义也不引入变量,所以,是的,CPUPACTY的措辞一般是错误的。“不仅仅是参考资料。”科拉德鲁道夫我们在这里必须非常小心使用术语。非引用非静态数据成员定义不定义对象(就像封闭类定义不定义该类的对象一样);它定义了一个类成员period。这样想:成员子对象需要一个封闭对象,否则,它们的子对象是什么?是的,当定义了封闭类的对象时,该定义也定义了其成员子对象;每个对象有不同的。非静态成员定义没有定义任何子对象。换句话说,数据成员与其对象/引用之间存在“1:n”关系。我认为它们也是由
throw
?@Cubbi创建的。我仍然感到困惑。所以在
结构Y{intm1;int&m2;}m1和m2都不是变量?如果是,变量的哪一部分是由非静态数据成员或对象之外的引用声明引入的?@Cheshar如果是,那么在您的答案中,引用数据成员被明确排除,为了弄清其余部分,你需要定义“object”。那么需要弄清的“rest”是什么?@Cubbi因为当你在引用3[basic]/6时说“引用数据成员被明确排除”时,我认为“非静态数据成员以外的”不包括非静态非引用数据成员的情况。如果是这样的话,您如何得出非静态、非引用数据成员不是变量的结论?
error: 'm' in capture list does not name a variable
error: member "X::m" is not a variable