コンパイラ警告 (レベル 4) C5267

ユーザー指定の代入演算子/コピー コンストラクターがあるため、'type' の暗黙的なコピー コンストラクター/代入演算子の定義は非推奨です

解説

C++ 標準では、一部の条件下でコピー演算子と代入演算子の暗黙的な生成が非推奨 (ただし削除されませんでした) されました。 MSVC コンパイラは引き続き、これらの条件下でコピー演算子と代入演算子を生成しますが、標準で非推奨の動作が削除された場合、将来その動作が変更される可能性があります。 この警告の目的は、委員会がこの機能を削除することを決定した場合に、コードの将来の証明に役立ちます。

C++ 標準の関連セクションは次のとおりです。

  • class.copy.ctor 段落 6。"クラス定義でコピー コンストラクターが明示的に宣言されていない場合は、非重複コンストラクターが暗黙的に宣言されます。 クラス定義で移動コンストラクターまたは移動代入演算子が宣言されている場合、暗黙的に宣言されたコピー コンストラクターは削除済みとして定義されます。それ以外の場合は、既定値になります。 後者のケースは、クラスにユーザー宣言コピー代入演算子またはユーザー宣言デストラクターがある場合は非推奨です。"
  • Annex D D.8。"クラスにユーザー宣言コピー代入演算子またはユーザー宣言デストラクターがある場合、既定のコピー コンストラクターの暗黙的な定義は非推奨です。 既定のコピー代入演算子の暗黙的な定義は、クラスにユーザー宣言コピー コンストラクターまたはユーザー宣言デストラクターがある場合は非推奨です。 将来のバージョンの C++ では、これらの暗黙的な定義が削除される可能性があります。

次のコードは、暗黙的に生成された特殊関数が呼び出されたが、明示的に定義されていない場合の警告 C5267 を示しています。 両方 /W4 とも、 /w45267 この警告を生成するために必要です。

// C5267.cpp
// compile using: /W4 /w45267
struct CopyCtorOnly
{
    CopyCtorOnly() = default;
    CopyCtorOnly(const CopyCtorOnly&) {} // C5267
};

struct CopyAssignOpOnly
{
    CopyAssignOpOnly() = default;
    CopyAssignOpOnly& operator=(const CopyAssignOpOnly&) // C5267
    {
        return *this;
    }
};

int main()
{
    CopyCtorOnly a1, a2;
    a1 = a2; // Calls deprecated copy assignment operator

    CopyAssignOpOnly b1;
    CopyAssignOpOnly b2 = b1; // Calls deprecated copy constructor
}

この問題を解決するには、不足しているコピー コンストラクターまたはコピー代入演算子を明示的に定義します。

関連項目

明示的に既定された関数および削除された関数