2013-03-23 2 views
26

Questa dovrebbe essere una domanda banale ma non ho potuto trovarla esplicitamente su StackOverflow.Condizioni in cui il compilatore non definirà impliciti (costruttore, distruttore, costruttore di copia, assegnazione copia)

Quanto segue verrà definito implicitamente se non fornito dall'utente.

  1. predefinito (senza parametri) costruttore
  2. costruttore di copia
  3. operatore di assegnamento per copia
  4. distruttore

Ma ho letto da qualche parte (che ho cant sembrano trovare ora), che ci sono alcune condizioni in cui il compilatore non li implementerà implicitamente.

Quali sono queste condizioni?

risposta

44

The Default Constuctor (ad esempio, X()) non sarà implicitamente generato se:

  • avete esplicitamente dichiarato ogni costruttore a tutti
  • v'è un membro di dati che non è default-costruibile (come ad esempio un riferimento, un oggetto const o una classe con costruttore predefinito non accessibile o inaccessibile)
  • (C++ 11) si è detto esplicitamente al compilatore di non generarne uno utilizzando X() = delete;

The Copy Constructor (ad esempio, X(const X&)) non sarà generato implicitamente se:

  • avete esplicitamente dichiarato un costruttore di copia (per la classe X un costruttore di prendere X, X& o const X&)
  • lì è un membro di dati che non è copiabile-costruibile (come una classe con costruttore di copie no o inaccessibile)
  • la classe base non è copia-costruibile
  • (C++ 11) si sono dichiarati un costruttore mossa o spostare operatore di assegnazione
  • (C++ 11) è stato esplicitamente detto che il compilatore non genera uno utilizzando X(const X&) = delete;

The Copy Assignment Operator (ad es., X& operator=(const X&)) non saranno implicitamente generato se:

  • avete esplicitamente dichiarato un operatore di assegnamento per copia (per la classe X un operator= prendere X, X& o const X&)
  • c'è un membro di dati nella classe che non è assegnabile in copia (come un riferimento, un oggetto const o una classe con operatore di assegnazione non accessibile o inaccessibile)
  • la classe base non è assegnabile in copia
  • (C++ 11) si dispone dichiarato un costruttore mossa o spostare operatore di assegnazione
  • (C++ 11) si hanno esplicitamente detto che il compilatore non genera uno utilizzando X& operator=(const X&) = delete;

The Destructor (ad esempio, ~X()) non saranno implicitamente generato se:

  • avete esplicitamente dichiarato un distruttore
  • (C++ 11) si hav e ha detto esplicitamente al compilatore per non generare uno utilizzando ~X() = delete;

The Move Constructor (C++ 11) (ad esempio, X(X&&)) non sarà implicitamente generato se:

  • avete esplicitamente dichiarato una mossa costruttore (per classe X, un costruttore che prende)
  • si ha dichiarato un operatore di assegnazione copia, copia costruttore, distruttore o mossa assegnazione assegnazione Rator
  • v'è un membro di dati nella classe che non può essere costruito muovere-(è const, è un riferimento, o è un eliminato, inaccessibile, o ambigua mossa costruttore)
  • la classe di base non può essere move-costruito
  • voi hanno esplicitamente detto che il compilatore non genera uno utilizzando X(X&&) = delete;

The Move Assignment Operator (C++ 11) (ad esempio,, X& operator=(X&&)) non saranno implicitamente generato se:

  • avete esplicitamente dichiarato un operatore di assegnazione mossa (per la classe X, un operator= prendendo X&&)
  • avete dichiarato un operatore di assegnamento per copia, copia costruttore, distruttore o costruttore di movimento
  • c'è un membro di dati nella classe che non può essere spostato (è const, è un riferimento o ha un operatore di assegnazione spostamento eliminato, inaccessibile o ambiguo)
  • la classe di base non può essere Move-assegnato
  • vi ho detto in modo esplicito al compilatore per non generare uno utilizzando X& operator=(X&&) = delete;
+0

Ebbene, in tutti quei secondo punto, sarà definito in modo implicito, proprio come 'delete' d. –

+1

+1 Non dimenticare le aggiunte di C++ 11 in cui puoi dichiarare esplicitamente che non dovrebbero essere create ('A (const A &) = delete;'), e dovresti aggiungere Move Constructors per completezza. – pickypg

+0

@pickypg: non sono molto sicuro dei costruttori di movimenti, sarei felice se avessi aggiunto le informazioni che volevi alla mia risposta –

Problemi correlati