【发布时间】:2013-11-02 18:44:33
【问题描述】:
根据 C++11 规则,默认生成 6 个东西(默认构造函数、复制构造函数、移动构造函数、复制赋值、移动赋值和析构函数)。根据第二条规则,当定义了任何自定义复制、移动或析构函数时,不会生成这些默认操作。 但在我后面的代码中,情况并非如此。但是这段代码编译失败,报错
call to implicitly deleted copy constructor of 'Uni'
当我为 Uni 编写自己的复制构造函数时,一切正常。 (代码中有注释,供参考)
任何想法都非常感谢。
最后,我在 Mac 上运行这个,Xcode 和 LLVM 编译器。
非常感谢...
#include <iostream>
class A
{
public:
A(int i) :num{i}
{
std::clog<< "ctor A() num = " << num << "\n";
}
A( A const &aRef)
:num{aRef.num}
{
std::clog << " copy ctor A( A const &aRef) num = " << num << "\n";
}
int value()
{
return num;
}
private:
int num;
};
class Uni
{
public:
Uni(A* aptr) : up{aptr}
{
std::clog << " ctor Uni value = " << up.get()->value() << "\n";
}
/*Uni(Uni const &uRef)
{
std::clog << " copy ctor Uni copying obj pointed by unique_ptr\n";
up.reset(uRef.up.get() ? new A{*uRef.up.get()} : nullptr);
}*/
private:
std::unique_ptr<A> up;
};
int main(int argc, const char * argv[])
{
Uni one{new A{10}};
Uni two{one}; //default copy ctor is implicitly deleted. why ?
}
【问题讨论】:
-
unique_ptr不能被复制,导致Uni的复制构造函数被定义为删除,导致编译错误。当您自己编写时,您显然不会遇到这个问题。
标签: c++ c++11 default-copy-constructor