我是靠谱客的博主 爱撒娇秀发,最近开发中收集的这篇文章主要介绍在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++函数形参里引用临时变量出错,导致"no match for xxx"的全部内容,希望文章能够帮你解决在c++函数形参里引用临时变量出错,导致"no match for xxx"所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部