C++ - 从移动分配运算符调用复制分配



以一个简单的类为例,其中移动赋值与复制赋值基本相同,并且可能会更改源对象中的某些内容。

在这种情况下,从移动赋值调用复制赋值是一个好的设计吗?

SomeClass& operator=(const SomeClass& source) {if( this != &source){ /*copy stuff*/}                    return *this;}
SomeClass& operator=(SomeClass&&      source) {if( this != &source){ *this = source; /*modify source*/} return *this;}

假设所有当前(和未来(编译器都将source视为*this = source中的普通引用,即使最初source作为右值引用(&&(传递,是否可以安全?因此,移动赋值不会递归地调用自己。还是只创建一个受保护的copy(source)方法并从两个运算符调用它更好?

假设所有当前(和未来(编译器都将source视为*this = source中的正常引用,即使最初源代码作为右值引用(&&(传递,是否安全?

这不是编译器将来会给你什么保证的问题,而是语言如何规则的问题。
移动分配运算符中的source是一个左值,其类型为SomeClass &&。因此,*this = source调用复制赋值运算符,因为它需要一个左值引用,这就是您实际提供的。
如果您在移动分配运算符中执行*this = std::move(source),情况会有所不同(如果需要,请参阅此处,段错误可能是您可以从中获得的最好的方法(。

话虽如此,从我的角度来看,如果它是一个好的设计,主要是基于意见的,所以我无法回答。无论如何,只要尊重复制和移动赋值的语义,我认为没有任何理由因为它如何实现这两个运算符而责怪一个类。

最新更新