当一个函数的形参为非const类型,而一个参数以非const传入,编译器一般会认为程序员会在该函数里修改该参数,而且该参数返回后还会发挥作用。此时如果你把一个临时变量当成非const引用传进来,由于临时变量的特殊性,程序员无法对改临时变量进行操作,同时临时变量可能随时会消失,修改临时变量也毫无意义,因此,临时变量不能作为非const引用。
例如++++i与i++++的区别,前者是合法的,后者是非法的;原因在于前者是i自增后再参与其他预算,而后者是i参与运算后对i的值(临时变量)再自增1,即i++++让第一个后++返回的临时对象再自增,这样对C++是无意义的,同样也是禁止的。
例子:
std::string a[10]={
"hello",
"world",
"shenzhen"
};
void print(const std::string& str){
std::cout << str << std::endl;
}
std::string get_string(int i){
return a[i];
}
int main(){
print(get_string(1));
return 0;
}
以上例子编译会提示错误:
error: cannot bind non-const lvalue reference of type
因为get_string(1)返回的是临时对象(属于const),而void print(std::string& str)要求接收非const引用,因此会报错,解决办法有多种: