int returnByValue()
{
return 5;
}
int main()
{
const int &cref = returnByValue(); // case I
int &ref = returnByValue(); // case II -- compilation error
return 0;
}
引用变量是一个别名,即一个值的别名,那么如果我没有错误,因为returnByValue()返回的值是一个rvalue,一个案例II有一个编译错误?
答案 0 :(得分:2)
引用背后的基本思想是左值引用绑定到左值,右值引用绑定到右值;此后约束的参考指的是它所绑定的值。
但是,C ++对此规则提出了一个例外,并允许 const 左值引用也绑定到rvalues。其原因主要是方便:它允许使用临时值调用具有const左值引用参数的函数,而不仅仅是使用左值:
void do_something(const ExpensiveType&); // expects lvalue?
ExpensiveType make_one();
// ...
do_something(make_one()); // call with rvalue is OK, too!
特别喜欢const-ref参数的函数是复制构造函数和复制赋值运算符;如果那些只能在左值上调用,那么你的代码中需要更多的样板。
此异常仅授予 const 引用,因为具有此类参数的函数不会修改参数,只能" read"他们,如果你愿意的话。相比之下,不允许rvalue引用绑定到可变左值引用,因为我们期望通过这样的引用修改该值,并且修改立即销毁的内容几乎肯定是编程错误。 (但如果你真的需要,你可以写一个用户定义的右值到左值的转换。)