Condividi tramite


Avviso del compilatore (livello 4) C5267

la definizione dell'operatore di assegnazione/costruttore di copia implicita per 'type' è deprecata perché dispone di un costruttore di assegnazione/copia fornito dall'utente

Osservazioni:

Lo standard C++ deprecato (ma non rimosso) la generazione implicita di operatori di copia e assegnazione in alcune condizioni. Il compilatore MSVC genera ancora gli operatori di copia e assegnazione in tali condizioni, ma può modificare il comportamento in futuro se lo standard rimuove il comportamento deprecato. Lo scopo di questo avviso è aiutare a verificare il codice in futuro se il comitato decide di rimuovere questa funzionalità.

Le sezioni pertinenti nello standard C++ sono:

  • class.copy.ctor paragrafo 6, che indica: "Se la definizione della classe non dichiara in modo esplicito un costruttore di copia, ne viene dichiarata implicitamente una nonxplicit. Se la definizione della classe dichiara un costruttore di spostamento o un operatore di assegnazione di spostamento, il costruttore di copia dichiarato in modo implicito viene definito come eliminato; in caso contrario, l'impostazione predefinita è . Quest'ultimo caso è deprecato se la classe ha un operatore di assegnazione di copia dichiarato dall'utente o un distruttore dichiarato dall'utente".
  • Allegato D.8, che indica: "La definizione implicita di un costruttore di copia come predefinita è deprecata se la classe ha un operatore di assegnazione di copia dichiarato dall'utente o un distruttore dichiarato dall'utente. La definizione implicita di un operatore di assegnazione di copia come predefinita è deprecata se la classe ha un costruttore di copia dichiarato dall'utente o un distruttore dichiarato dall'utente. È possibile che le versioni future di C++ specifichino che queste definizioni implicite vengono eliminate."

Esempio

Il codice seguente mostra l'avviso C5267 quando viene chiamata una funzione speciale generata in modo implicito ma non è definita in modo esplicito. Sia /W4 che /w45267 sono necessari per generare questo avviso.

// 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
}

Per risolvere questo problema, definire in modo esplicito il costruttore di copia mancante o l'operatore di assegnazione di copia.

Vedi anche

Funzioni impostate come predefinite ed eliminate in modo esplicito