Share via


編譯器警告 (層級 4) C5267

' type ' 的隱含複製建構函式/指派運算子的定義已被取代,因為它具有使用者提供的指派運算子/複製建構函式

備註

C++ 標準已淘汰(但未移除)在某些情況下隱含產生複製和指派運算子。 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
}

若要解決此問題,請明確定義遺漏的複製建構函式或複製指派運算子。

另請參閱

明確的預設和已刪除的函式