Genesi dell'estensione di durata dell'oggetto temporaneo C ++

6

Sto revisionando una proposta per espandere il Funzione C ++ in cui gli oggetti "temporanei" cessano di essere temporanei se collegati a un nome vincolando un riferimento. Ecco un esempio del comportamento classico (non della proposta):

int && i = 3 + 3; // Calculate 3+3 and give a name to the result.
int j = 3 + 3; // Create a named variable, calculate 3 + 3, and copy the result in.

// Similar outcomes, but not exactly the same when using more complex types:

struct haz_int {
    int member;
    ~ haz_int() { std::cout << "No haz!\n"; }
};
int value = has_int{ 3 }.member; // Create a haz_int, copy its member out.
int && value = haz_int{ 3 }.member; // Retain entire haz_int and name its member.

Chi ha inventato l'estensione a vita temporanea e perché? D & E , la retrospettiva del 1994 dall'inventore della lingua Stroustrup, non lo menziona nella sua sezione sull'argomento. Secondo D & E , la vita degli oggetti temporanei era controversa durante il processo di standardizzazione iniziale, quindi è un po 'sorprendente che sia stata riaperta e ottimizzata. D'altra parte, è possibile che abbia trascurato di menzionarlo come un dettaglio minore. Questo sembra dubbio perché il suo scopo dichiarato in quella sezione è:

I will present two issues, name lookup and lifetime of temporaries, to illustrate the difficult and detailed work done. The majority of the committee's efforts are expended on such issues.

Il primo progetto di lavoro dello standard pubblicato sul Sito del gruppo di lavoro ISO, dal settembre 1993, afferma (§8.4.3 Riferimenti ),

… if and only if the reference is to a const and an object of type T can be created from the initializer, such an object will be created. The reference then becomes a name for that object.

The lifetime of a temporary object created in this way is the scope in which it is created (3.5). Note that a reference to a class B can be initialized by an object of a class D provided B is an accessible and unambiguous base class of D (in that case a D is a B); see 4.7.

Aggiornamento:

Gli archivi della carta proposta tornano più indietro. Dal luglio 1993, N0305 di Dag Brück è molto simile al riassunto del dibattito di Stroustrup in D & E . Si menziona:

Also note that a reference may be bound to a temporary, in which case the temporary has the lifetime of the enclosing scope, see Section 8.4.3 of the Working Paper.

Quindi, apparentemente, la regola di estensione della durata è precedente alla regola generale per la durata dei provvisori!

    
posta Potatoswatter 16.08.2015 - 09:57
fonte

1 risposta

5

N0345 Durata della vita dei provvisori legata in modo esplicito ai riferimenti , di John Bruns e del settembre 1993, è ciò che ha arricchito i dettagli dell'estensione a vita.

Il documento menziona brevemente una motivazione per la forma preesistente e più semplice di estensione della durata, che è quella di evitare di copiare oggetti di classe. Indica anche in modo affidabile che gli argomenti delle funzioni vengano rifattorizzati in oggetti con nome.

Propone una regola più strong di quella alla fine adottata:

For any statement explicitly binding a reference to a temporary, the lifetime of all temporaries in the statement are extended to match the lifetime of the reference.

Forse la mia proposta troverà supporto, essendo in mezzo tra questo ideale originale e lo status quo.

    
risposta data 16.08.2015 - 16:49
fonte

Leggi altre domande sui tag