【问题标题】:What are "names which are not lvalues"?什么是“不是左值的名称”?
【发布时间】:2020-11-29 13:14:15
【问题描述】:

Effective Modern C++errata 中有一个条目说

并非所有名称都是左值

这些名字是什么?具体来说,

  1. Scott 只是指nullptrthis 命名的prvalues 吗?
  2. 还有其他的吗?
  3. 如果对 1 的回答是,那么与truefalse 相比,nullptr 的特殊之处是什么?它们都是某种类型的值(bool 类型的true/falsestd::nullptr_t 类型的nullptr)。毕竟true 停留在bool 就像1 停留在int 一样,而1 不是“不是左值的名称”,不是吗?此时我会问为什么true 不是名字呢?

【问题讨论】:

  • 例如一个枚举器 - X 声明为 enum E { X };
  • 在过去,“左值”表示可以出现在赋值左侧的名称(同样,“右值”只能出现在右侧)。因此,基本上,任何您无法为其赋值的名称都不是左值。 (注意assign这个词,和initialize不一样;const int x = 5;初始化x,但是x不是左值,因为不能写@ 987654343@).
  • @PeteBecker 不只是一个不可修改的左值吗?
  • @Enrico -- 正如我所说,那是过去的事了。没有不可修改左值的概念,因为根据定义,左值可以出现在赋值的左侧,即它是可修改的。

标签: c++ c++11 types value-categories


【解决方案1】:

表达式X 其中X 是枚举数的名称(例如声明为enum E { X };)具有右值 值类别。


对于非类型模板参数也是如此(@PasserBy 的帽子提示),如

template <int X>
int f() { return X; /* X is an rvalue */}

【讨论】:

  • 还有模板参数、模板本身、标签、命名空间和包。不确定位域。
  • @PasserBy 其中大部分不能作为表达式使用(作为左值是表达式的属性,所以“a name is an lvalue”只能理解为“一个id由该名称组成的 -expression 是一个左值”),但我授予您非类型模板参数。答案相应修改。
  • @IgorTandetnik,你能评论我的问题吗?例如,对于我来说,true(它是一个右值)是否确实是一个 name 对我来说并不明显。
  • true 不是名称(它不是由声明引入的)。这是一个关键字,表示文字。
  • @IgorTandetnik,nullptrthis 也不是名称而是关键字?
猜你喜欢
  • 2015-10-05
  • 2016-12-25
  • 2015-02-06
  • 2015-03-09
  • 2022-01-22
  • 2011-09-17
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多