我正在读Stroustrup的C++之旅,里面有这样一句话:
为了补充=default
,我们有=delete
来指示不生成操作。 类层次结构中的基类是我们不希望允许成员复制的典型例子。
作为一个新的复制/移动语义的人,我很难理解为什么基地类不想有一个成员的复制。 我会认为基类将负责复制其成员,派生类将负责复制其馀部分。 如有任何实例将不胜感激。
因为这并不总是有意义的。
如果您有一个带有简单字段的类(例如person
),那么使用某种默认的复制/移动构造函数是有意义的。 毕竟它是一个数据类。
当您的类使用其他类型的资源(如流,数据库连接,套接字等)进行操作时,这种情况就会发生故障,而这些资源并不是您真正想要复制的--因此,我们通过告诉编译器不要为此实现默认复制来防止错误发生(尽管移动一次可能没什么问题)。
一方面,这是防止意外切片的好方法,因为尝试这样做会导致编译错误。
另一方面,我认为你是对的:为了把整个复制操作的各个“部分”放到最明智的地方,这种风险只是一个小小的代价。 我不知道为什么要让派生类负责操作基成员的复制。 或者,想一想,也许这会阻止整个层次结构从一开始就被复制。
如果基类是完全空的(没有数据成员,只有函数),那么我认为这样更合理。
就我个人而言,我只会删除一个复制构造函数,如果我希望它是不可复制的句号。