在c++函数形参里引用临时变量出错,导致"no match for xxx"

帮别人调代码遇到的一个bug。他的代码里首先定义了一个类colum,然后重载了等号“=”操作符,函数定义是void colum::operator=(colum& c2)。接着代码里写了一句a = colum();,希望临时构造一个colum对象并赋值给对象a。如果用g++编译这段代码,会遇到下面的错误信息:

/ *your_code* : In function ‘int main()’:
/ *your_code* :96:8: error: no match for ‘operator=’ (operand types are ‘colum’ and ‘colum’)
   Q[i] = colum(n);
        ^
/ *your_code* :96:8: note: candidate is:
/ *your_code* :56:6: note: void colum::operator=(colum&)
 void colum::operator=(colum& c2) {
      ^
/ *your_code* :56:6: note:   no known conversion for argument 1 from ‘colum’ to ‘colum&’

看这个信息的意思,貌似是类型转换出了问题,但如果相信这个你就被坑了(我也是……)。

实际情况是,由于我们赋值的方式是a = colum();,colum的构造函数会返回一个临时变量,临时变量不是左值(无法被寻址),因此不能直接引用。

经过实验,解决方法有两个:
一是将函数声明改成void colum::operator=(const colum& c2),常量引用会默认构造一个临时变量存放c2然后再返回这个临时变量的引用,我的理解,这相当于延长了我们原有的临时变量(colum()返回的那个)的生存周期。
二是将函数声明改成void colum::operator=(colum c2),由于C/C++是传值的,因此也会构造一个临时变量把我们原有的临时变量存进去,跟第一种一样。

你可能感兴趣的:(C++,C语言)