【发布时间】:2019-05-12 00:49:47
【问题描述】:
[basic] p6 状态:
通过声明非静态数据成员或对象以外的引用来引入变量。变量的名称(如果有)表示引用或对象。
int a = 0; // declaration of an object, this introduces the variable x, and an object is created
int{0}; // not a declaration of a variable, this does not introduce a variable, but an object is created
这是否意味着变量是对象或引用(不是非静态成员)?在整个标准中,它们被称为好像它们具有对象/引用的属性,但正式定义似乎没有说明这一点。让我困惑的是,变量名指的是对象或引用,而不是变量本身。
例如,[basic.life] p1 是这样说的:
如果一个变量是默认初始化的并且 [...]
这暗示了与对象和引用具有相同属性的变量,因为它们可以被初始化。
所以我的问题是:
变量是否只是一种语法结构,旨在将由声明引入的对象和引用组合成一个术语?变量本身是对象还是引用?
【问题讨论】:
-
在我看来,“变量”这个词的定义指定了变量是如何引入的,但它从来没有指定什么一个变量 is (不是一个有名字的东西)。在我看来,这是一个写得很糟糕的定义。
-
请注意,引用的措辞来自 [basic.life]/1 was changed much recently。
-
@KeithThompson:这是一个标准,而不是参考手册。 “变量”的含义并没有合并在一个地方。这一段不是为了定义这个概念。它只是说是什么创造了一个。
-
@Krystian:应该注意的是,关于空初始化的引用可能是一个规范错误。 C++17 谈到 objects 有空的初始化;例如,
new int使用空初始化。鉴于这一新措辞仅涉及变量;new int不能进行空初始化。再说一次,我不确定“空初始化”的目的是什么,因为他们摆脱了允许空初始化对象在初始化完成之前出现的异常。
标签: c++ language-lawyer