C++ `std::unique_ptr`使编译错误'候选构造函数(隐式副本构造函数)不可行`

C++ `std::unique_ptr`使编译错误'候选构造函数(隐式副本构造函数)不可行`,c++,constructor,static-methods,unique-ptr,C++,Constructor,Static Methods,Unique Ptr,std::unique_ptr使编译错误候选构造函数(隐式副本构造函数)不可行 让我用下面的代码来声明它 导致编译错误的代码是: 代码0:错误 #include <iostream> class A { public: static A str(){ return A();} std::unique_ptr<int> pi; A(): pi(new int(0)){} }; 但以下所有示例都是ok #include <iostream>

std::unique_ptr
使编译错误
候选构造函数(隐式副本构造函数)不可行

让我用下面的代码来声明它

导致编译错误的代码是:

代码0:错误

#include <iostream>
class A {
public:
    static A str(){ return A();}
    std::unique_ptr<int> pi;
    A(): pi(new int(0)){}
};
但以下所有示例都是ok

#include <iostream>
class A {
public:
    //static A str(){ return A();}
    std::unique_ptr<int> pi;
    A(): pi(new int(0)){}
};
#include <iostream>
class A {
public:
    static A str(){ return A();}
    //std::unique_ptr<int> pi;
    A()/*: pi(new int(0))*/{}
};
#include <iostream>
class A {
public:
    static A str(){ return A();}
    std::shared_ptr<int> pi;
    A(): pi(new int(0)){}
};
代码1:正常

#include <iostream>
class A {
public:
    //static A str(){ return A();}
    std::unique_ptr<int> pi;
    A(): pi(new int(0)){}
};
#include <iostream>
class A {
public:
    static A str(){ return A();}
    //std::unique_ptr<int> pi;
    A()/*: pi(new int(0))*/{}
};
#include <iostream>
class A {
public:
    static A str(){ return A();}
    std::shared_ptr<int> pi;
    A(): pi(new int(0)){}
};

有人能解释一下吗?

这里编译得很好,您使用的是
-std=c++11
?您是否包括
?@orlp和
-std=c++11
,即使不包括
,也没关系。代码在c++11中是正确的,在c++03中是不正确的(因为
std::unique_ptr
在c++03中不存在),其中@M:也是来自
c++11
。与之有什么区别?@user3909241
unique\u ptr
不可复制。它只能移动。在C++11
中返回A()
是一个移动操作,但在C++03中它是一个复制操作,因为C++03没有移动。