2012-07-19 7 views
53

Powiel możliwe:
Does a const reference prolong the life of a temporary?Wracając tymczasowy obiekt i wiązanie z const odniesienia

Mój kompilator nie narzekają przypisując tymczasowy do const odniesienia:

string foo() { 
    return string("123"); 
}; 

int main() { 
    const string& val = foo(); 
    printf("%s\n", val.c_str()); 
    return 0; 
} 

Dlaczego ? Myślałem, że ciąg zwrócony z foo jest tymczasowy, a val może wskazywać na obiekt, którego czas życia dobiegł końca. Czy standard C++ na to pozwala i przedłuża żywotność zwracanego obiektu?

+4

Tak, czas życia tymczasowego jest przedłużony, o ile jest to ** const ** reference. – chris

+2

To nie jest dokładnie duplikat 2784262, który (powinien) potraktować przypadek, w którym odniesienie jest członkiem klasy. Zachowanie jest inne. – aberaud

+1

@aberaud nie tylko to nie jest duplikat, jest o wiele lepsze pytanie Cieszę się, że znalazłem. – dashesy

Odpowiedz

66

To jest funkcja C++. Kod jest ważny i robi dokładnie to, co wydaje się robić.

Zwykle obiekt tymczasowy trwa tylko do końca pełnego wyrażenia, w którym się pojawia. Jednak C++ rozmyślnie określa, że ​​powiązanie obiektu tymczasowego z odniesieniem do const na stosie wydłuża czas życia tymczasowego do okresu istnienia samego odniesienia, a tym samym pozwala uniknąć tego, co w innym przypadku byłoby zwykłym błędem zwisającego odniesienia. W powyższym przykładzie tymczasowy zwrócony przez foo() żyje do zamknięcia nawiasu klamrowego.

P.S: Dotyczy to wyłącznie odniesień do stosów. Nie działa dla odniesień będących członkami obiektów.

Pełny tekst: GotW #88: A Candidate For the “Most Important const” by Herb Sutter.

+2

Należy również zauważyć, że w tym miejscu nie ma kopii, konstruktor kopii dla łańcucha musi istnieć i być dostępny. – xryl669

+0

ponownie ** PS **, jest to bardzo ważne, a wątek związany z dupe SO z powyższym odnośnikiem ma dobre ilustracje: –

+0

@ xryl669 Czy [C++ 17 Guaranteed copy elision] (http: //www.open-std. org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html) czy konstruktor kopii nie jest już potrzebny? zacytuj: '' 'gdy obiekt źródłowy jest tymczasowy' '' – dashesy

Powiązane problemy