错误:从“int"类型的右值初始化“int&"类型的非常量引用无效

2021-12-13 00:00:00 reference pointers c++

错误的形式:

int &z = 12;

正确形式:

int y;
int &r = y;

问题:
为什么第一个代码是错误的?标题中错误的含义"是什么?

推荐答案

C++03 3.10/1 说:每个表达式要么是左值,要么是右值."重要的是要记住,左值与右值是表达式的属性,而不是对象的属性.

C++03 3.10/1 says: "Every expression is either an lvalue or an rvalue." It's important to remember that lvalueness versus rvalueness is a property of expressions, not of objects.

左值命名对象超出单个表达式.例如, obj*ptrptr[index]++x 都是左值.

Lvalues name objects that persist beyond a single expression. For example, obj , *ptr , ptr[index] , and ++x are all lvalues.

右值是在它们所在的完整表达式的末尾(在分号处")消失的临时变量.例如, 1729x + ystd::string("meow")x++ 是所有右值.

Rvalues are temporaries that evaporate at the end of the full-expression in which they live ("at the semicolon"). For example, 1729 , x + y , std::string("meow") , and x++ are all rvalues.

address-of 运算符要求其操作数应为左值".如果我们可以取一个表达式的地址,那么这个表达式就是一个左值,否则就是一个右值.

The address-of operator requires that its "operand shall be an lvalue". if we could take the address of one expression, the expression is an lvalue, otherwise it's an rvalue.

 &obj; //  valid
 &12;  //invalid

相关文章