Capisco che quando gli oggetti vengono restituiti in base al valore di una funzione, vengono chiamati i loro costruttori di copia. Se una classe ha un costruttore di copie cancellato, la restituzione per valore fallirà.Perché il costruttore di copie non viene chiamato quando restituisce un valore di inizializzazione di un oggetto con valore di lista?
struct X {
X(const X &) = delete;
};
X f() {
return X{};
}
error: call to deleted constructor of 'X'
C++ 11 ci dà extended-inizializzatori. E ho letto da qualche parte su un SO post che questo
X f() {
return {};
}
è lo stesso di
X f() {
return X{};
}
Allora, perché non il codice qui sotto mi danno un errore? Passa e ho anche arrivare a chiamare la funzione di principale: viene riportato
struct D {
D(const D &) = delete;
};
D f() { return {}; }
int main()
{
f();
}
Here is a demo. Nessun errore. Lo trovo strano perché credo che il costruttore di copia debba essere chiamato. Qualcuno può spiegare perché non viene dato alcun errore?
Cosa succede se elimini il costruttore di mosse? C++ 11 afferma che sarà usato se disponibile. –
È interessante notare che non riesco a ottenere il codice da compilare su gcc 4.7.2 o uno snapshot 4.8. [Demo] (http://ideone.com/L94cwe). – juanchopanza
@CrazyEddie Quando lo elimino viene indicato l'errore. Wow, è stato inaspettato. Mente postare che come risposta? –