編譯器警告 (層級 4) C5267
'type' 的隱含複製建構函式/指派運算子的定義已被取代,因為其具有使用者提供的指派運算子/複製建構函式
備註
C++ Standard 已被取代(但未移除)在某些情況下隱含產生複製和指派運算符。 MSVC 編譯程式仍會在這些情況下產生複製和指派運算符,但如果標準移除已被取代的行為,未來可能會變更其行為。 如果委員會決定移除這項功能,此警告的目的是協助日後證明您的程序代碼。
C++標準中的相關區段如下:
- class.copy.ctor 段落 6,其表示:「如果類別定義未明確宣告複製建構函式,則會隱含宣告非表達式。 如果類別定義宣告移動建構函式或移動指派運算符,則會將隱含宣告的複製建構函式定義為已刪除;否則,預設為 。 如果類別具有使用者宣告的複製指派運算符或使用者宣告的解構函式,則會取代後者。
- 附錄 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
}
若要解決此問題,請明確定義遺漏的複製建構函式或複製指派運算符。