Questo bug report menzioni questo banco di prova che non emette un avvertimento in gcc:
struct W {
int a;
~W() { a = 9; }
};
int main() {
W w {};
W v = w;
}
Fare riferimento al commento di Johnathan Wakely:
che non è vero, il compilatore può (e lo fa) avvisare sul codice legale.
sto confermando questo, ci vorrà l'avvertimento ad un certo punto, e permetterebbe di migliorare questa parte delle -Weffc++
avvertimenti:
* Articolo 11: Definire un costruttore di copia e un operatore di assegnazione per le classi con memoria allocata dinamicamente.
(vedi PR 16166 per maggiori dettagli)
forse potremmo chiamare questo avvertimento -Wdeprecated-special-members
, e averlo abilitato -Weffc++
e in C++ 11 anche da -Wdeprecated
Clang già mette in guardia su questo con -Wdeprecated
:
main.cpp:3:3: warning: definition of implicit copy constructor for 'W' is deprecated because it has a user-declared destructor [-Wdeprecated]
~W() { a = 9; }
^
main.cpp:8:8: note: implicit copy constructor for 'W' first required here
W v = w;
Microsoft afferma esplicitamente che Visual Studio non emette un avviso in questo caso:
Inoltre, lo standard C++ 11 specifica i seguenti ulteriori regole:
Se un costruttore di copia o distruttore è dichiarato esplicitamente, quindi la generazione automatica dell'operatore di copia-assegnazione è deprecata.
Se un operatore di assegnazione delle copie o un distruttore è dichiarato esplicitamente, la generazione automatica del costruttore di copie è deprecata.
In entrambi i casi, Visual Studio continua a generare automaticamente le funzioni necessarie implicitamente, e non emette un avvertimento.
fonte
2014-10-08 09:40:28
Si può solo ereditare da 'noncopyable': http: //www.boost.org/doc/libs/1_55_0/libs/utility/utility.htm#Class_noncopyable – EdChum
Per VS si potrebbe attivare "warning-come- errori " –
@MarcoA. È un avvertimento? In quale versione e a quale livello di avviso? – Felics