非静态非引用数据成员声明变量?

时间:2017-02-05 14:50:07

标签: c++ language-lawyer

我想根据答案重新提出一个问题并附上以下讨论:
Why is a non static data member reference not a variable?

  

类的非静态数据成员本身并不创建新变量,它只是帮助您定义类的属性。如果确实创建了一个新变量,那么您就可以编写如下代码:

@section('scripts')
  

这甚至意味着什么?它会找到Chamber的每个实例并将所有的底池设置为2吗?这是胡说八道。

但是,在当前n4296 c++17 draft中,变量仍定义为(class Chamber { public: int pot; }; void f(bool b) { if (b) Chamber::pot = 2; } ):

  

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

接受答案中的论证对我来说似乎是合乎逻辑的,但基于我对上面变量定义的理解,它与标准相冲突。

问题是非静态非引用数据成员声明变量,如果是,为什么它们被认为是如此,因为我不能以直观的方式使用它们(例如{{1}来自答案中的例子)?

2 个答案:

答案 0 :(得分:3)

不,正如Igor Tandetnik在评论中指出的那样,非静态数据成员声明永远不是变量,因为它们永远不是对象。它们是为成员提供对象类型的声明,但在创建类的实例之前没有对象。

引用Richard Smith

  

我认为问题在于"参考声明的模糊性"是。我相信这里的意图是"参考声明"是声明特定名称为引用类型(引用类型的非静态数据成员声明所做的)的声明,不一定是导致特定引用的生命周期开始的声明。相反,一个"对象的声明"旨在被解释为声明特定名称以声明特定对象(非静态数据成员声明不具有)的声明。

     

那是:

{{1}}
     

'一个'是引用的声明,因此我们需要另一个条件来限制它作为变量。 ' B'是/否/是对象的声明,所以我们不需要再说些什么。

     

有关如何改写此内容以使其更清晰的建议将受到欢迎:)

随后发现https://github.com/cplusplus/draft/issues/1280,发现了一些不一致之处。运气好的话,这将被视为同时清理标准的好机会。

答案 1 :(得分:2)

  

接受的答案中的论证对我来说似乎是合乎逻辑的,但基于我对上述变量定义的理解,它与标准相冲突。

与标准没有冲突,你误解了引用§3.6的文字。

非静态数据成员不是对象,因此它也不是变量。

对象在其生命周期内占据存储区域(请参阅[intro.object])。非静态数据成员声明不会占用占用存储区域的某些内容的生命周期。所以它不会创建一个对象。

当您构造类'type的对象时,将有一个与数据成员对应的子对象,但该子对象是在创建封闭对象时创建的,并且仅在对象的生存期内存在。它不是由类中数据成员的声明创建的。

即。数据成员的子对象是在创建包含它的类对象时创建的,而不是在声明数据成员时创建的。

因此,如果它不是一个对象,那么它不是一个变量。

  

问题是非静态非引用数据成员声明变量,

没有