4
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
4

2 回答 2

13

您像这样声明了复制构造函数:

stri(stri &s1);

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

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

由于这是复制初始化,因此需要调用复制构造函数。但是由于临时对象不能绑定到对非常量对象的引用,所以会出现错误。

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

stri(stri const&);

现在它需要一个对 const 的引用,并且一个临时的可以绑定到它。修复现在应该很明显了。

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

于 2013-05-30T12:24:07.043 回答
3

让我掸掉我的水晶球,猜猜你得到的错误是在“临时不能绑定到引用”的某个地方。那是因为您的复制构造函数将其参数作为stri &而不是const stri &; 换句话说,对非常量的引用。此类引用不能绑定到临时对象。s1 + s2返回一个临时值,因此复制 ctor 调用失败。

除非你在你的复制 ctor 中做了非常奇怪的事情(修改从中复制的对象),否则将其更改为将其参数作为const stri &.

于 2013-05-30T12:25:17.503 回答