【发布时间】:2015-08-17 15:59:38
【问题描述】:
虽然不是实际标准,但我依赖 cppreference.com 上的 this page 来了解这个特定的措辞:
左值是标识非临时对象或 非成员函数。
以下表达式是左值:
- 范围内的变量或函数的名称,与类型无关,例如 std::cin 或 std::endl。即使变量的类型是右值 引用,由其名称组成的表达式是一个左值 表达。
...
我对上面引用部分的(简化)理解是左值:
- 是参考
- 不能是临时对象
我知道引用不是对象,所以第 2 点必须意味着就引用而言,它不能 引用 到临时对象。但是,从表达式本身来看,这是否意味着对临时的引用不是左值?您可以引用临时和非临时对象:
int myvar = 0;
int& ref_myvar = myvar; // Reference to non-temporary
class foo {};
foo const& ref_foo = foo{}; // Reference to temporary
在上面的代码sn-p中,以后在单独的表达式中使用ref_foo是不是左值?右值引用有一条规则,即在表达式中按名称使用的右值引用仍然是左值(因为此时您引用了名称)。此规则是否也适用于左值引用(因为它们也有名称,并且在表达式中使用名称本身会使其成为左值,就像右值引用变量一样)?
我希望我有某种意义。至少我希望我的困惑的根源是显而易见的。上面的左值引用如何在表达式中使用以证明与我的问题相关的一些点的一些示例也将是一个巨大的帮助。
【问题讨论】:
-
左值不一定是引用,因为引用是类型的一部分,与值类别正交。在您的示例中,
myvar、ref_myvar和ref_foo在用作表达式时都是左值。foo{}和0不是左值。 -
我写了一个相关问题的答案here,也许会有所帮助。