2014-11-12 13 views
7

La sezione N3797::12.8/11 [class.copy] dice:Il caso in cui il costruttore di copia implicitamente definito come cancellati

Un costruttore implicitamente dichiarata copiare/spostare è una linea pubblica membro della sua classe. Un default costruttore di copia/spostamento per una classe X è definita come eliminato (8.4.3) se X ha:

[...]

- un data non statici membro del tipo di classe M (o matrice esso) che non può essere copiato/spostato perché la risoluzione di sovraccarico (13.3), applicato ad M corrispondente costruttore risultati in un'ambiguità o una funzione che viene eliminato o inaccessibile dal costruttore stabilizzato

Il primo caso sull'ambiguità del corrispondente costruttore di copia/spostamento è abbastanza chiaro. Possiamo scrivere quanto segue:

#include <iostream> 
using namespace std; 

struct A 
{ 
    A(){ } 
    A(volatile A&){ } 
    A(const A&, int a = 6){ } 
}; 

struct U 
{ 
    U(){ }; 
    A a; 
}; 

U u; 

U t = u; 

int main(){ } 

per riflettere questo. Ma che dire di o di una funzione che è stata cancellata o inaccessibile dal costruttore predefinito? Cosa si ottiene con una funzione inaccessibile dal costruttore predefinito? Potresti fornire un esempio che rifletta questo?

+0

Dice * costruttore predefinito *, non "costruttore predefinito" - si riferisce al costruttore di copia/spostamento predefinito –

risposta

6

In poche parole:

struct M { M(M const&) =delete; }; 
struct X { X(X const&) =default; M m; }; // X(X const&) is actually deleted! 

funzioni Implicitamente-dichiarate sono anche considerati "in default" ([dcl.fct.def.default]/5); un più familiare pre-C++ 11 esempio potrebbe essere qualcosa del tipo:

struct M { protected: M(M const&); }; 
struct X { M m; }; // X's implicit copy constructor is deleted! 

Si noti che se default esplicitamente la funzione dopo è stata dichiarata, il programma è mal formata se la funzione sarebbe implicitamente soppresso ([dcl.fct.def.default]/5):

struct M { M(M const&) =delete; }; 
struct X { X(X const&); M m; }; 

X::X(X const&) =default; // Not allowed. 
+2

+1, nice [esempio] (http://coliru.stacked-crooked.com/a/51ef1acf1d514c68) – Niall

+0

Infatti, grazie .. –

0

un membro di dati non-statico del tipo di classe M (o matrice di esso) che non possono essere copiati/spostati perché risoluzione di sovraccarico (13.3), applicato al costruttore corrispondente di M, risulta in un ambigui ty o una funzione che viene eliminato o inaccessibili dal costruttore in default

La formulazione è forse un po 'forzato, per concisione sicuramente. L'idea, come sottolineato in precedenza, è che la funzione in questione è il Mcopy constructor sovraccaricato in modo da renderlo inaccessibile. Quindi avere un membro della classe M il cui costruttore di copie è reso protected ad esempio delete il costruttore di copia di X. Allo stesso modo, la semplice eliminazione del costruttore di copie di M avrebbe lo stesso risultato.

Problemi correlati