C++ - 从移动分配运算符调用复制分配
C++ - Calling copy assignment from move assignment operator
以一个简单的类为例,其中移动赋值与复制赋值基本相同,并且可能会更改源对象中的某些内容。
在这种情况下,从移动赋值调用复制赋值是一个好的设计吗?
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)
,情况会有所不同(如果需要,请参阅此处,段错误可能是您可以从中获得的最好的方法(。
话虽如此,从我的角度来看,如果它是一个好的设计,主要是基于意见的,所以我无法回答。无论如何,只要尊重复制和移动赋值的语义,我认为没有任何理由因为它如何实现这两个运算符而责怪一个类。
相关文章:
- 正在尝试重载二进制搜索树分配运算符
- 自定义先决条件对移动分配运算符有效吗
- C++ - 没有自定义交换功能的移动分配运算符?
- 强制复制分配超过移动分配运算符
- 在之后仍需要使用源对象时调用父移动分配运算符
- c++ 使用动态分配运算符反向数组元素
- 当存在用户定义的移动分配运算符时,已删除模板移动分配运算符
- C++ - 从移动分配运算符调用复制分配
- 不工作 复制分配运算符
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- 返回对象如何与分配运算符一起工作
- 下标是否在分配运算符的右侧进行评估
- C++分配适用于已删除的分配运算符
- 用于删除复制/移动分配运算符的有效签名
- 使用新放置作为复制分配运算符不好吗?
- C++ - 父级中的 CRTP 分配运算符不起作用
- 复制派生类的分配运算符
- 未定义 Lambda 复制分配运算符
- 为什么标准在移动分配运算符中使用交换?
- 正确编写复制构造函数和分配运算符的方法