Inizializzazione della copia con costruttore di copia eliminato nell'inizializzazione del riferimento

Inizializzazione della copia con costruttore di copia eliminato nell'inizializzazione del riferimento

Esaminiamo cosa dice lo standard:

Quindi, un temporaneo di tipo T è costruito. Questo temporaneo viene inizializzato dalla copia dall'oggetto specificato. OK... come funziona?

Bene, hai citato la regola che spiega come funzionerà l'inizializzazione della copia dal valore dato. Tenterà di invocare conversioni definite dall'utente, passando al setaccio i costruttori applicabili di T e gli operatori di conversione sul valore (e non ce ne sono, essendo di tipo int ). C'è un costruttore di conversione implicita su T che accetta un oggetto di tipo int . Quindi quel costruttore viene chiamato per inizializzare l'oggetto.

Il riferimento è quindi vincolato a quello temporaneo, secondo le regole che hai citato.

In nessun momento c'è qualche tentativo di chiamare una delle funzioni eliminate. Solo perché si chiama "inizializzazione della copia" non significa che un costruttore di copia sarà chiamato. Si chiama "inizializzazione della copia" perché (di solito) viene provocata usando un = segno, e quindi sembra "in copia".

Il motivo Data d = a; non funziona perché C++11 definisce questa operazione per convertire prima a in un Data temporaneo, quindi per inizializzare d con quella temporanea. Cioè, è essenzialmente equivalente a Data d = Data(a); . Quest'ultima inizializzazione invocherà (ipoteticamente) un costruttore di copia, portando così all'errore.


Questo problema viene affrontato dal numero 1604 e la soluzione proposta sembra confermare che tale codice dovrebbe essere di formato errato, quindi lo considererei un bug del compilatore.

Fortunatamente, dal C++17, questo codice diventa ben formato grazie all'elisione della copia garantita, che è d'accordo con i compilatori.


La risposta accettata sembra irrilevante; La sequenza è semplice come sembra. Nessun costruttore di copia/spostamento o ottimizzazione è coinvolto; tutti i temi sono rigorosamente irrilevanti. Un 'Data' temporaneo viene costruito da un 'int', usando un ctor di conversione. Il valore pr viene quindi associato a un riferimento lvalue 'const'. Questo è tutto. Se questo non sembra corretto, stiamo discutendo diversi linguaggi di programmazione; Sto certamente parlando di C++.

PS:Non posso citare riferimenti allo standard, perché non posso permettermi di ottenerlo.

EDIT====================================================

'=' è solo un altro modo per chiamare un singolo argomento ctor non contrassegnato come 'esplicito'. È lo stesso delle parentesi graffe o tonde, purché il ctor accetti parametri singoli, a meno che il ctor non sia 'esplicito'. Nessuno impara a programmare leggendo gli standard; È per i progettisti di compilatori.

Meglio, FM.