48

C++11 の規則に従って、6 つのもの (デフォルト コンストラクター、コピー コンストラクター、ムーブ コンストラクター、コピー代入、ムーブ代入、およびデストラクタ) がデフォルトで生成されます。2 番目の規則により、カスタムのコピー、移動、またはデストラクタが定義されている場合、それらのデフォルトの操作は生成されません。しかし、それに続く私のコードではそうではありません。しかし、このコードはエラーでコンパイルに失敗します

call to implicitly deleted copy constructor of 'Uni'

Uni 用に独自のコピー コンストラクターを作成すると、すべて正常に動作します。(参照用にコードにコメントされています)

どんな考えでも大歓迎です。

最後に、LLVM コンパイラを使用した Xcode の Mac でこれを実行しています。

どうもありがとう...

#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 ?
}
4

1 に答える 1