2012-02-06 11 views
16

WCzy to tymczasowe odniesienie przetrwało wystarczająco długo?

template <typename T> 
T const & foo(T const & dflt) 
    { return /* ... */ ? /* ... */ : dflt; } 

int x = foo(5); 

Czy odniesienie do tymczasowego „przeżyć”, dopóki nie jest przypisany do X?

(wiem, że to przetrwa czas trwania foo() rozmowy, ale przypisanie sprawia, że ​​waha)

Kod w pytaniu ma kilka legalnych zastosowań dla powołując się na referencje const tutaj, to znaczy, że będę potrzebował dwóch oddzielnych funkcje

T const & foo_cr(T const & dflt); 
T const & foo_v(T dflt); 

który chcę uniknąć (tylko opierając się na różnych podpisów wnioskach o tej samej nazwie wydaje się nieco ryzykowne dla mnie.)

+0

Co oznacza "...? ...: dflt; "to miało znaczyć? 0_o –

+1

'...' w tym kontekście jest "kod, który jest nieistotny dla pytania. Zmieniłem go na komentarze, może to jest jaśniejsze – peterchen

Odpowiedz

14

Czy odwołanie do czasowego „przeżyć” u ntil jest przypisany do x?

Generalnie tak. Jeśli foo zwraca dflt, to odwołanie (do tymczasowego 5) jest poprawne do końca pełnego wyrażenia, w którym zostało utworzone, co oznacza, że ​​do momentu inicjalizacji.

C++ 03, 12.2/3:

Kiedy implementacja wprowadza tymczasowy obiekt klasy, która ma nietrywialne konstruktora (12,1), zapewnia, że ​​ konstruktor nazywa dla obiektu tymczasowego. Podobnie, destruktor powinien zostać wywołany jako tymczasowy z nietrywialnym destruktorem (12.4). Obiekty tymczasowe są niszczone jako ostatni krok w analizie pełnego wyrażenia (1.9), które (leksykalnie) zawiera punkt, w którym zostały utworzone. Dzieje się tak nawet wtedy, gdy ocena kończy się wyrzuceniem wyjątku.

Więcej jest w 12.2/4 i 12.2/5, szczególnie wyjątków od tej reguły.

Nie widzę, co się stanie, gdy zwróci się ..., którego pominąłeś, ale domyślam się, że nie pytałeś o to.

+7

Obecnie nie jest określony, że sklep" x "jest częścią pełnego Zobacz http://llvm.org/bugs/show_bug.cgi?id=9783, jednak zdecydowanie pożądany przez komitet i (miejmy nadzieję) użytkowników, ale niezależnie od tego, jest już określony przez specyfikację, że * czytać * wartości referencyjnej zwróconej przez 'foo' (lwartość-r-wartość) jest częścią pełnego wyrażenia Patrz: 1.9p10 i jego końcowy przykład: –

+0

Dzięki za szybką odpowiedź! Tak, ... przypadek jest bezpieczny - po prostu wykluczyć (odniesienie do elementu zbioru przekazanego przez odniesienie jako parametr dodatkowy) – peterchen

Powiązane problemy