从右值初始化非const引用

时间:2017-01-05 18:22:00

标签: c++ c++11 visual-c++

int returnByValue()
{
    return 5;
}

int main()
{
    const int &cref = returnByValue(); // case I
    int &ref = returnByValue(); // case II -- compilation error
    return 0;
}

引用变量是一个别名,即一个值的别名,那么如果我没有错误,因为returnByValue()返回的值是一个rvalue,一个案例II有一个编译错误?

1 个答案:

答案 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引用绑定到可变左值引用,因为我们期望通过这样的引用修改该值,并且修改立即销毁的内容几乎肯定是编程错误。 (但如果你真的需要,你可以写一个用户定义的右值到左值的转换。)