【问题标题】:Given a cctor, can the assignment operator always be safely created by the compiler?给定一个 cctor,编译器总是可以安全地创建赋值运算符吗?
【发布时间】:2011-07-24 10:47:21
【问题描述】:

我在考虑 swap() 成语。

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

我可能看得太简单了,但我想知道为什么不能这样做。

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    另外,如果必须手动编写复制构造函数,而不仅仅是复制成员,那么swap 函数也很重要,因此您必须手动提供也是。

    在 C++0x 中,您可以使用= default 使编译器自动生成构造函数和赋值运算符,但它们只是逐个成员操作,而不使用复制+交换习语。

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

    Edit. 换一种说法:Copy/Move+Swap 是您可以选择的一个习惯用法,但它不是递归构建更大的默认方法较小的类型。没有自动隐含的swap(这里是previous discussion),因为它留给用户的设计选择来实现复制、移动和交换。

    【讨论】:

    • 默认赋值运算符是自动生成的,即使使用用户定义的复制构造函数(很可能做错了)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 1970-01-01
      • 2020-11-19
      • 2021-11-16
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      相关资源
      最近更新 更多