将类与unique_ptr交换
Swapping class with unique_ptr
#include <memory>
#include <algorithm>
using namespace std;
class A {
public:
unique_ptr<int> u;
A(){}
A(const A& other): u(new int(*other.u)){} // If I comment this out, it works.
// A(A&&){} // This does not help.
};
int main() {
A a;
A b = a;
swap(a, b);
}
此代码不起作用 - 失败,模板错误墙说no matching function for call to ‘swap(A&, A&)’
。为什么?删除第二个构造函数会有所帮助,但我在其他代码中需要它。我猜它可能与定义其他构造函数时自动删除某些构造函数有关,但手动添加移动构造函数也无济于事。我该如何解决这个问题?
std::swap()
要求其参数是可移动构造的和可移动可分配的。
鉴于:
struct A {
unique_ptr<int> u;
A();
};
A
是可交换的,这要归功于隐式定义的移动构造函数和移动赋值运算符。
但是,鉴于:
struct A {
unique_ptr<int> u;
A();
A(A const&);
};
通过声明用户定义的复制构造函数,您将禁止A
的移动构造函数和移动赋值运算符的隐式定义(并且通过拥有不可分配可复制的成员,您将禁止隐式生成A
的复制构造函数和复制赋值运算符(。
要使A
再次可交换,您需要同时定义两者(*(:
struct A {
unique_ptr<int> u;
A();
A(A const&);
A(A&&);
A& operator=(A&&);
};
或者两者都不是,只需添加适当的复制分配:
struct A {
unique_ptr<int> u;
A();
A(A const&);
A& operator=(A const&);
};
但是,这可能会破坏您在 Exchange 上避免深度副本的初衷,因此您最终可能会定义所有这些副本。
(*( 否,仅为简洁起见省略了规格...
相关文章:
- C++嵌套if语句,基本货币交换
- shell排序中的交换和比较
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 通过交换元素使数组相同
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 交换运算符 + 重载会导致无限递归
- 为什么 std::reduce 需要交换性?
- 复制和交换习惯用法与移动操作之间的交互
- C++ - 没有自定义交换功能的移动分配运算符?
- 如何在数组中交换最小和最大的位置?
- 为共享 ptr 向量实现复制 c'tor?
- 尽管一切看起来都很好,但值不会交换
- C++交换来自同一类成员的参数值,处理多个类
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 插入排序的最小交换
- C++在 2 个向量向量之间交换向量