次のコード スニペットでは、コピー代入演算子が選択されていないのはなぜですか?
コピーコンストラクターが削除されていることについて不平を言ってコンパイルしません。ユーザー宣言の代入演算子を試してみましたが、それでもうまくいきませんでした。したがって、暗黙の生成ルールが破られているわけではありません (動作を妨げる可能性があり=default
ます)。
struct obj {
obj() = default;
~obj() = default;
obj(const obj&) = delete;
obj(obj&&) = default;
obj& operator=(const obj&) = default;
// obj& operator=(const obj&) {return *this;} // nada
obj& operator=(obj&&) = default;
int t{42};
};
int main(int, char**) {
obj o1;
obj o2 = o1; // <-- problem is here
// but this is ok
obj o3;
o3.operator=(o1);
// or this
obj o4;
o4 = o1;
}
これがゴッドボルトの例です: https://godbolt.org/z/MkZuGs
いくつかのコンパイラを試しました。私の推測では、どういうわけか、宣言はコピー コンストラクターを呼び出す必要がありますが、その方法や理由がわかりません。