为什么复制构造函数没有在这里调用

时间:2013-05-30 12:16:26

标签: c++

stri(){}

stri(char *s);//constructor used to initilize object with constant string

stri(stri &s1);//copy constructor performs memberwise copy

friend stri operator+(stri &s1,stri &s2);//conccats two string objects

void operator=(stri &s);//performs memberwise copy

//In main
//s1 and s2 are initilized with constant strings
stri s3=s1+s2; //Gives error? However when copy constructor is removed works fine

2 个答案:

答案 0 :(得分:13)

你声明了这样的复制构造函数:

stri(stri &s1);

这一行,特别是=右侧的表达式,产生一个临时的:

stri s3 = s1+s2;
       // ^^^^^ the result of this expression is a temporary

由于这是复制初始化,因此需要调用复制构造函数。但由于临时工具无法绑定到对非const对象的引用,因此会出错。

当您注释掉复制构造函数时,编译器会为您生成一个。它的签名是

stri(stri const&);

现在它需要引用const,而临时可以绑定它。修复现在应该是显而易见的。

请注意,即使格式良好的复制初始化需要可访问的复制构造函数,编译器也可以选择在优化期间忽略对它的调用,即使该省略更改了程序的可观察行为。

答案 1 :(得分:3)

让我把我的水晶球弄脏,然后猜测你所得到的错误就是“临时无法绑定参考”。那是因为您的复制构造函数将其参数设为stri &而不是const stri &;换句话说,对非const的引用。这些引用不能与临时文本绑定。 s1 + s2返回一个临时的,因此复制ctor调用失败。

除非您在复制文件中执行非常糟糕的操作(修改复制的对象),否则请将其更改为将其参数设为const stri &