2014-10-08 13 views
5

Esistono flag di compilazione per applicare le regole successive?Come disabilitare la generazione del costruttore di copie implicitamente definita quando esiste un distruttore definito dall'utente

La generazione del costruttore di copie implicitamente definito è deprecata se T ha un distruttore definito dall'utente o un operatore di assegnazione copia definito dall'utente.

La generazione dell'operatore di assegnazione di copia implicitamente definita è deprecato (dal C++ 11) se T ha un distruttore dichiarato dall'utente o costruttore di copia dichiarato dall'utente.

Sono interessato a far rispettare le regole in qualsiasi Clang, Visual Studio 2013 o GCC poiché il codebase verrà compilato con tutti loro.

+0

Si può solo ereditare da 'noncopyable': http: //www.boost.org/doc/libs/1_55_0/libs/utility/utility.htm#Class_noncopyable – EdChum

+0

Per VS si potrebbe attivare "warning-come- errori " –

+0

@MarcoA. È un avvertimento? In quale versione e a quale livello di avviso? – Felics

risposta

5

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.

+1

-Wdeprecated è abbastanza buono per me. Ho già avvertimenti come errori :) – Felics

Problemi correlati