【问题标题】:Definition of a C++ variable, section Basic/6C++ 变量的定义,Basic/6 节
【发布时间】: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


【解决方案1】:

正如Basic/3 中明确指出的,变量不是“实体”。对象和引用是实体,但不是变量。因此,您可以将变量视为纯粹的语法结构,而不是一流的 C++ 事物。

Basic/6 告诉我们变量名denotes 由该变量声明的对象/引用。这应该被理解为简单的英语:通过变量声明创建的对象/引用具有变量名称。相反,变量命名通过变量声明创建的对象/引用。

所以当标准说:

如果一个变量被默认初始化并且...

意思是:

如果一个[变量声明引入的引用/对象]被默认初始化并且...

【讨论】:

  • 所以变量是已经声明的对象或引用
  • eel.is/c++draft/basic#7 似乎说变量是事实上的实体。我相信,由于变量只是对象或引用(通过声明引入)的统称,因此它们是可传递的实体。
  • @KrystianS:“本地实体是具有自动存储持续时间的[引用/变量声明引入的对象],一种结构化绑定,其对应的[变量声明引入的引用/对象]是这样的实体,或 *this 对象。”
  • 是的,所以变量是可传递的实体。否则,“其对应的变量就是这样一个实体”将不成立。
  • @KrystianS 你上次问过“结果”和“表达式表示什么”之间的区别。这里我们有相同的比喻:metonymy。转喻的使用有助于缩短标准,但使其不那么具体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多