11

C++ の一般的なパターンは、コピー コンストラクターを非公開にすることです。

class A
{
    public:
        // ...
    private:
        A(const A&);
};

しかし、次のコードはコンパイルされますか (C++11/14):

A f();

auto a = f();

この標準には、ムーブ コンストラクターの自動生成に関する情報が含まれています。私は、実際に移動コンストラクターを生成する標準にもコンパイラーにもアクセスできません。私の質問は: 私は書く必要がありますか?

class A
{
    public:
        // ...
    private:
        A(const A&);
        A(const A&&);
};

同様に移動を防ぐには(そしてoperators =同様に)?

4

1 に答える 1

15

しかし、次のコードはコンパイルされますか (C++11/14):

いいえ、それはしません。ユーザー宣言のコピー コンストラクターが存在すると、ムーブ コンストラクターの暗黙的な生成が禁止されます。C++11 標準のパラグラフ 12.8/9 によると:

クラス X の定義でムーブ コンストラクターが明示的に宣言されていない場合、1 つが暗黙的にデフォルトとして宣言されます。

— X にはユーザー宣言のコピー コンストラクターがありません。

— X には、ユーザー宣言のコピー代入演算子がありません。

— X には、ユーザーが宣言した移動代入演算子がありません。

— X にはユーザー宣言のデストラクタがなく、かつ

— 移動コンストラクターは暗黙的に削除済みとして定義されません。

于 2013-07-05T16:14:51.047 に答える