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 typeT
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 classD
providedB
is an accessible and unambiguous base class ofD
(in that case aD
is aB
); 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!