我在想swap()习语。
如果我们有一个有效的复制构造函数,为什么编译器不能通过交换“this”指针在场景后面生成“交换”函数?
我可能过于简单地看待这个,但我想知道为什么不能这样做。
答案 0 :(得分:3)
我认为可以,但事实并非如此。构造函数和赋值的默认版本只是构造/分配成员。如果您已经需要编写自己的复制构造函数(这显然是一个警告信号,并且只应在极少数情况下发生),那么您的课程就会发生一些非常重要的事情,并且很可能不会做正确的事情。
另外,如果复制构造函数必须手工编写而不仅仅是复制成员,那么swap
函数也可能是非平凡的,所以你必须提供手动也是如此。
在C ++ 0x中,您可以使用= default
使编译器自动生成构造函数并自动生成赋值运算符,但这些只是逐个成员操作而不是使用copy + swap惯用法。
但是,对于大多数类,您应该为您的成员使用资源管理容器,这些容器本身实现了所有正确的功能,并且您的类本身应该能够使用默认的复制/移动构造函数和赋值。
编辑。换句话说:复制/移动+交换是一种可以选择的习惯用法,但它不是递归构建更大的默认方式较小的类型。没有自动暗示swap
(这里是previous discussion就此问题)因为它留给用户的设计选择,以实现复制,移动和交换。
答案 1 :(得分:3)
你无法交换this
指针。这甚至没有意义。甚至忽略了交换指针不会交换值的事实,this
只是对象的一个别名,还有更多。