gpt4 book ai didi

c++ - 类定义中涉及私有(private)unique_ptr时C++中的引用初始化

转载 作者:行者123 更新时间:2023-11-30 00:49:00 25 4
gpt4 key购买 nike

下面的编译错误如何解释?

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class A{
unique_ptr<vector<short>> v;
public:
A(){
v = unique_ptr<vector<short>>(new vector<short>());
cout << "A()" << endl;
}
A(const A& a) : A(){
cout << "A(const A& a)" << endl;
}
};

int main() {

A a1; // prints A()
A a2 = a1; // prints A() then A(const A& a)
A& a3 = a1; // prints nothing
a3 = a1; // compile time error: use of deleted function ‘A& A::operator=(const A&)

return 0;
}

实际上,为什么 A& a3 = a1 可以,而 a3 = a1 不行?此外,正在使用哪个重载版本的 operator= 以及如何正确实现它以避免此类问题?

最佳答案

在行中

a3 = a1;

您正在调用已删除的 operator=(请记住 unique_ptr 是不可复制的)。 g++ 为你吐出错误:

error: use of deleted function 'A& A::operator=(const A&)'

而在行中

A& a3 = a1; 

没有复制,你只初始化了一个引用。

你可能想移动你的指针,比如

a3 = std::move(a1); 

不幸的是,它不起作用,因为您显式声明了一个复制构造函数,这会阻止编译器生成默认的移动构造函数和赋值运算符。解决方案:将移动赋值运算符和移动构造函数声明为=default;,

A& operator=(A&&) = default;
A(A&&) = default;

上面的 a3 = std::move(a1) 行将起作用。

关于c++ - 类定义中涉及私有(private)unique_ptr时C++中的引用初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30060351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com