2013-05-27 11 views
6

Znam rodzaj i poniżej w main() jest int&. Dlatego należy go zainicjować.Typ "i" poniżej w głównej(). Dlaczego to int i?

int& f(){ static int i = 1; return i; } 

int main() 
{ 
    decltype(f()) i = f(); 
} 

Ale stosując paragraf 5p5 w normie, dochodzę do wniosku, że wyrażenie f() ma typ int jako odniesienie jest odrzucany.

Od 7.1.6.2p4, jak można powiedzieć, że wyrażenie f() jest lwartością, ponieważ referencja została usunięta z funkcji return?

+0

Należy zauważyć, że jest to prawie dokładnie sposób działania funkcji 'decltype (auto) C++ 14. – PlasmaHH

Odpowiedz

6

Odniesienie upuszczeniu oceniając rodzaj ekspresji (zgodnie z § 5/5), ale to nie zmienia faktu, że funkcja wyrażenie wezwanie f() jest lwartość. Zgodnie z pkt 5.2.2/10 C++ 11 Standard:

Wywołanie funkcji jest lwartość jeśli typ wynik jest lwartość typ odniesienia lub RValue odniesienia funkcjonować typ , xvalue, jeśli typ wyniku jest odniesieniem do typu obiektu i prvalue.

Innymi słowy odniesienia nie jest odrzucany z rodzaju powrotnego samej funkcji tylko od rodzaju badanej wyrażenia wywołania funkcji (jest zatem int).

Fakt, że funkcja jest zwrócenie lwartości odniesienia jest to, co pozwala systemowi typu klasyfikowania odpowiadające wyrażenia wywołania funkcji jako lwartościami - co z kolei pozwala decltype dodać lwartości odniesienie do rodzaju wyrażenia, dając w ten sposób int&.

Powiązane problemy