以一个简单的类为例,其中移动赋值与复制赋值基本相同,并且可能会更改源对象中的某些内容。
在这种情况下,从移动赋值调用复制赋值是一个好的设计吗?
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)
,情况会有所不同(如果需要,请参阅此处,段错误可能是您可以从中获得的最好的方法(。
话虽如此,从我的角度来看,如果它是一个好的设计,主要是基于意见的,所以我无法回答。无论如何,只要尊重复制和移动赋值的语义,我认为没有任何理由因为它如何实现这两个运算符而责怪一个类。