当一个函数的形参为非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引用,因此会报错,解决办法有多种:

  1. print(std::string& str)改成print(const std::string& str);
  2. print(std::string& str)改成print(std::string str);
  3. 先定义一个变量对象用于接收get_string(1)的返回值,再传给print(std::string& str);
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐