4

C++11 より前は、次のようなコードを見ました。

class Car {
public:
  Car() {}
private:
  Car(const Car&);
  Car& operator=(const Car&);
};

C++11 (およびそれ以降) の場合、次のようなコードが表示されます。

class Car {
public:
  Car() {}
private:
  Car(const Car&) = delete;
  Car& operator=(const Car&) = delete;
};

それらは同じように動作しますか? そうでない場合は、説明してください。

参考:https ://ariya.io/2015/01/c-class-and-preventing-object-copy

4

4 に答える 4

5

投稿した 2 つのスニペットは、次のようなまったく同じエラーを出すことに注意してください。

'Car(const Car&)' は、このコンテキスト内で非公開です

これは、どちらの場合もメンバー メソッドをプライベートとして定義したためです。
違いを理解したい場合は、パブリックdeleted コピー コンストラクターとコピー オペレーターを使用する必要があります。つまり、次のようになります。

class Car {
public:
  Car() {}
// private: <-- this should not be here
  Car(const Car&) = delete;
  Car& operator=(const Car&) = delete;
};

このようにして、これらのメンバー メソッドが明示的かつ意図的に削除されたことが通知されます。

削除された関数「Car(const Car&)」の使用

それらを非公開に設定しても、明示的に I want to delete them とは言えません。
例として、クラスのユーザーにファクトリ メソッドを使用してそのクラスのインスタンスを作成するように強制することができます。

とにかく、(もはやそうではありませんが)新機能は無料ではなく、意図した方法で使用しないと、期待されるメリットが得られません。

于 2016-10-06T06:18:36.203 に答える