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
您像这样声明了复制构造函数:
stri(stri &s1);
这一行,特别是右侧的表达式=
,产生一个临时的:
stri s3 = s1+s2;
// ^^^^^ the result of this expression is a temporary
因为这是复制初始化,它需要调用复制构造函数。但由于临时对象无法绑定到非常量对象的引用,因此您会收到错误。
当您注释掉复制构造函数时,编译器会为您生成一个。那么它的签名是
stri(stri const&);
现在它需要一个对 const 的引用,并且可以将临时对象绑定到它。现在修复应该很明显了。
请注意,即使格式正确的复制初始化需要可访问的复制构造函数,编译器也可以选择在优化期间省略对它的调用,即使该省略会更改程序的可观察行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)