0

次のコード スニペットでは、コピー代入演算子が選択されていないのはなぜですか?

コピーコンストラクターが削除されていることについて不平を言ってコンパイルしません。ユーザー宣言の代入演算子を試してみましたが、それでもうまくいきませんでした。したがって、暗黙の生成ルールが破られているわけではありません (動作を妨げる可能性があり=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

いくつかのコンパイラを試しました。私の推測では、どういうわけか、宣言コピー コンストラクターを呼び出す必要がありますが、その方法や理由がわかりません。

4

0 に答える 0