【发布时间】:2011-07-24 10:47:21
【问题描述】:
我在考虑 swap() 成语。
如果我们有一个有效的复制构造函数,为什么编译器不能通过交换“this”指针在后台生成一个“swap”函数?
我可能看得太简单了,但我想知道为什么不能这样做。
【问题讨论】:
标签: c++
我在考虑 swap() 成语。
如果我们有一个有效的复制构造函数,为什么编译器不能通过交换“this”指针在后台生成一个“swap”函数?
我可能看得太简单了,但我想知道为什么不能这样做。
【问题讨论】:
标签: c++
我想它可以,但事实并非如此。构造函数和赋值的默认版本只是逐个成员构造/赋值。如果您已经需要编写自己的复制构造函数(这显然是一个警告信号,应该只在极少数情况下发生),那么您的类有一些不平凡的事情发生,而且很可能不会做正确的事情。
另外,如果必须手动编写复制构造函数,而不仅仅是复制成员,那么swap 函数也很重要,因此您必须手动提供也是。
在 C++0x 中,您可以使用= default 使编译器自动生成构造函数和赋值运算符,但它们只是逐个成员操作,而不使用复制+交换习语。
但是,对于大多数类,您应该为您的成员使用资源管理容器,这些容器本身实现了所有正确的功能,并且您的类本身应该能够使用默认的复制/移动构造函数和赋值。
Edit. 换一种说法:Copy/Move+Swap 是您可以选择的一个习惯用法,但它不是递归构建更大的默认方法较小的类型。没有自动隐含的swap(这里是previous discussion),因为它留给用户的设计选择来实现复制、移动和交换。
【讨论】:
您不能交换 this 指针。这甚至没有意义。即使忽略交换指针不会交换值这一事实,this 只是对象的一个别名,还有更多。
【讨论】: