给定一个cctor,编译器是否可以安全地创建赋值运算符?

时间:2011-07-24 10:47:21

标签: c++

我在想swap()习语。

如果我们有一个有效的复制构造函数,为什么编译器不能通过交换“this”指针在场景后面生成“交换”函数?

我可能过于简单地看待这个,但我想知道为什么不能这样做。

2 个答案:

答案 0 :(得分:3)

我认为可以,但事实并非如此。构造函数和赋值的默认版本只是构造/分配成员。如果您已经需要编写自己的复制构造函数(这显然是一个警告信号,并且只应在极少数情况下发生),那么您的课程就会发生一些非常重要的事情,并且很可能不会做正确的事情。

另外,如果复制构造函数必须手工编写而不仅仅是复制成员,那么swap函数也可能是非平凡的,所以你必须提供手动也是如此。

在C ++ 0x中,您可以使用= default使编译器自动生成构造函数并自动生成赋值运算符,但这些只是逐个成员操作而不是使用copy + swap惯用法。

但是,对于大多数类,您应该为您的成员使用资源管理容器,这些容器本身实现了所有正确的功能,并且您的类本身应该能够使用默认的复制/移动构造函数和赋值。

编辑。换句话说:复制/移动+交换是一种可以选择的习惯用法,但它不是递归构建更大的默认方式较小的类型。没有自动暗示swap(这里是previous discussion就此问题)因为它留给用户的设计选择,以实现复制,移动和交换。

答案 1 :(得分:3)

你无法交换this指针。这甚至没有意义。甚至忽略了交换指针不会交换值的事实,this只是对象的一个​​别名,还有更多。