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
答案 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 &
。