コンパイラ警告 (レベル 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
}
この問題を解決するには、不足しているコピー コンストラクターまたはコピー代入演算子を明示的に定義します。