常量左值引用可以绑定到右值,而非常量引用不可以

927 阅读1分钟

举个例子:

void func(int& a)
{
    a++;
}

int main()
{
    double b = 1.2;
    func(b);
    return 0;
}

上述代码,在gcc下编译报错:
error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’

这是因为,b是double类型,而func的形参是int类型,因此当b作为实参传给func时,会导致生成一个临时的int变量,
假设为c,此时c为右值,将c绑定到非常量引用a是不被允许的,因为这改变了右值不可被修改的语义,容易产生莫名的bug。
而常量左值引用可以绑定到右值,因为这从语义上保证了不会改变右值。