这里的理论怀疑。读一本书,并给出了这样的陈述:StringBad metoo = knot;
其中:
作者说以下关于复制构造函数:
实现可以选择以两种方式处理此语句 步骤:使用复制构造函数创建临时对象和 然后使用赋值将值复制到新对象。也就是说, 初始化总是调用一个复制构造函数,并使用 =运算符也可以调用赋值运算符。
我的实现只需一步即可完成:
StringBad metoo(knot);
我可以理解其他实现可以分两步完成:
StringBad metoo;
但是作者说初始化总是调用复制构造函数。那是对的吗?如果是这样,编译器在一些实现中将遵循哪些步骤来分两步完成它?我无法在我的测试中测试它,因为我说它只是一步完成。
答案 0 :(得分:2)
作者错了。你所拥有的是一个带有复制初始化的声明语句,唯一可以实现的方法是通过StringBad(StringBad const &)
复制构造函数实例化一个新对象。*赋值运算符将永远被调用在这种情况下,甚至不需要存在或无法访问。
两种变体StringBad metoo = knot;
和StringBad metoo(knot);
之间几乎没有区别。
*)或非const版本,如果它恰好存在且匹配。