非const引用只能绑定到与该引用同类型的对象,而const引用则可以绑定到不同的但相关的对象或绑定到右值。 --c++primer
因为如果将const引用绑定到不同类型的对象(前提是被引用的类型可以转化为引用的类型),会生成一个临时对象,绑定的对象其实是这个临时对象,对这个临时对象操作并不会影响到被引用的对象,所以c++一般规定编译器自行构造的临时对象都是const的,这个也是c++禁止为非常量引用生成临时对象的原因。
例如:
const int & i = 3.14;
//实际过程如下
const int temp(3.14);
const int &i = temp;
结论:必须用const引用绑定临时对象
下面还有一个小例子:
string foo( );
void bar(string & s);
//那么下面的表达式将是非法的:
bar(foo( ));
bar("hello world");
但是有的童鞋可能发现,在vs2017中,下面的代码是可以编译通过的。 这是为什么呢?
在知乎上邀请了轮子哥回答,回答如下:
string foo()
{
return string();
}
void bar(string & s)
{}
int main()
{
bar(foo());
getchar();
return 0;
}