免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: smartvessel
打印 上一主题 下一主题

[C++] 奇怪的构造函数的问题(no matching function for call ),请关注 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-12-03 06:39 |只看该作者
原帖由 OwnWaterloo 于 2009-12-2 04:46 发表
A a,b;
a = b;  "="到底会调用什么?

1. 当A同时有copy constructor和copy assignment operator。
2. 当A只有copy constructor
3. 当A只有copy assignment operator


这个问题我一直没在标准中查到… ...


汗,不敢。
我觉得这种情况当然是调用copy assignment operator,如果没有就会调用隐式生成的copy assignment operator如果可能的话,否则就会报错吧。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
22 [报告]
发表于 2009-12-03 07:56 |只看该作者

回复 #21 emacsnw 的帖子

起得真早……

那怎么解释1楼的代码呢?

a = tp(); // 这是调用copy assignment?
// 隐式申明这个: A& A:: operaotr=(const A&); ?

那…… 错在哪呢……


报错也很奇怪:
main.cpp:47: error: no matching function for call to `Example:: Example(Example)'
main.cpp:24: note: candidates are: Example::Example(Example& )

会什么匹配的是A::A(A); ?  这根本不是合法的copy constructor签名……

论坛徽章:
0
23 [报告]
发表于 2009-12-03 10:31 |只看该作者
原帖由 OwnWaterloo 于 2009-12-3 07:56 发表
起得真早……

那怎么解释1楼的代码呢?

a = tp(); // 这是调用copy assignment?
// 隐式申明这个: A& A:: operaotr=(const A&); ?

那…… 错在哪呢……


报错也很奇怪:
main.cpp:47: error: ...


a = tp(); //程序并没有用到拷贝构造函数,用的是默认的赋值运算符。

从反汇编来看,并没有创建临时对象,而是直接用tp中的局部对象b为main中的a调用赋值运算符,完了回到main再析构b,最后析构a。

那为什么还会说找不到合适的拷贝构造函数呢?

论坛徽章:
0
24 [报告]
发表于 2009-12-04 13:38 |只看该作者
原帖由 OwnWaterloo 于 2009-12-2 15:56 发表
起得真早……

那怎么解释1楼的代码呢?

a = tp(); // 这是调用copy assignment?
// 隐式申明这个: A& A:: operaotr=(const A&); ?

那…… 错在哪呢……


报错也很奇怪:
main.cpp:47: error: ...


对,这个都不是copy constructor的合法signature.
我是了一下这个代码在我机器上可以,加上#include <cstring>后-Wall也没问题:g++ 4.4.1.

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
25 [报告]
发表于 2009-12-04 16:23 |只看该作者

回复 #24 emacsnw 的帖子

难道是gcc3的bug……

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
26 [报告]
发表于 2013-07-18 23:52 |只看该作者
这个问题实际上应该是由于tp这个函数的引发的。这个函数的反回值会生成临时对象,而这个对象是个rvalue,而明显copy constructor的参数是lvalue(引用),所以这个转换通不过才报的错,可以编译通过的版本应该是进行了RVO把这个临时对象给消除了所以又可以编译通过了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP