概述
帮别人调代码遇到的一个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++函数形参里引用临时变量出错,导致"no match for xxx"的全部内容,希望文章能够帮你解决在c++函数形参里引用临时变量出错,导致"no match for xxx"所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复