stack<int> stos;//value_type is int [/code]
Schody zaczynają się, jeżeli używamy vector'a. Jak wiemy ma on specjalizowany typ o nazwie [b]reference[/b]. Szczegóły na dole tej strony:
:arrow: http://cplusplus.com/reference/stl/vector/
I teraz tak. Funkcja top() wywoła funkcję back(). Funkcja back() zwróci [b]reference[/b].
O co chodzi ? Jak to jest możliwe, że skoro klasa reference nie ma operatora bool() - funkcja top() zwraca (bez błędów kompilatora) referencję do bool ? Przecież nie ma takiej konwersji zdefiniowanej przez twórców klasy reference. A zwracany jest na pewno obiekt tej klasy. Dlaczego ? Dlatego, że niemożliwe jest takie wyrażenie:
[code=php]stackbool, vectorbool stos;stos.push(true);stos.push(false);stos.push(false);
Nie wiem czy dobrze Cię zrozumiałem, brak mi jakiegoś głównego pytania w tym poście.
Pod g++ 4.4.1 dostaję jedynie ostrzeżenie “warning: taking address of temporary”. A u Ciebie ten kod się nie kompiluje? stack >::top zwraca u mnie ów obiekt reference (konkretnie jest on typu std::_Bit_reference, ale to bez znaczenia).
Na jakiej podstawie tak stwierdzasz? Może jest to zależne od implementacji, ale popatrzyłem w źródła libstdc++ i std::stack >::top zwraca std::stack::reference, który jest zdefiniowany jako Sequence::reference. Czyli w przypadku twojego kodu vector::reference który to typ jest tym typem pośredniczącym o którym mowa tutaj http://cplusplus.com/reference/stl/vector/ a który w libstdc++ nazywa się std::_Bit_reference.