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
问问题
210 次
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 回答