В соответствии с правилами С++ 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 ?
}