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