私は「5つのルール」に関するこの素晴らしい答えを読んでいましたが、以前に見たことを思い出せない何かに気づきました。
class C {
...
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
...
};
コピー代入演算子とムーブ代入演算子の&
前に配置された文字の目的は何ですか?= default
誰かがこれについての参照を持っていますか?
私は「5つのルール」に関するこの素晴らしい答えを読んでいましたが、以前に見たことを思い出せない何かに気づきました。
class C {
...
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
...
};
コピー代入演算子とムーブ代入演算子の&
前に配置された文字の目的は何ですか?= default
誰かがこれについての参照を持っていますか?
これは、C ++ 11の非静的メンバー関数が、左辺値と右辺値のどちらで呼び出されているかを区別できるようにする機能の一部です。
上記の場合、ここでデフォルトになっているコピー代入演算子は、左辺値でのみ呼び出すことができます。これは、十分に確立された左辺値と右辺値の参照バインディングのルールを使用します。これは、それらを確立するだけですthis
。
上記の場合、コピー代入演算子は、コピー先のオブジェクトが非定数左辺値参照にバインドできる場合にのみデフォルトになります。したがって、これは問題ありません。
C c{};
c = C{};
これではありません:
C{} = c;
ここでの一時的な値は左辺値参照にバインドできないため、コピー代入演算子を呼び出すことはできません。また、この宣言は通常のコピー代入演算子の作成を妨げるため、この構文は一時的なものへのコピー代入(またはムーブ代入)を効果的に防ぎます。&&
これを復元するには、バージョンを追加する必要があります。
C& operator=(const C&) && = default;
C& operator=(C&&) && = default;
これは、その関数が左辺値でのみ呼び出し可能であることを意味します。したがって、代入演算子関数が右辺値オブジェクト式で呼び出されるため、これは失敗します。
C() = x;