[C++] Typ wartości zwracanej w funkcji top() w stack


(Quentin) #1

Witam!

Mam dość skomplikowane pytanie. Jak wszyscy wiemy w funkcji składowej top() w kontenerze stack (stos) typ wartości zwracanej to value_type&.

:arrow: http://cplusplus.com/reference/stl/stack/top/

Czyli:

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);

(Sawyer47) #2

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).

Mógłbyś krótko napisać o co Ci chodzi?


(Quentin) #3

Stack::Top zwraca bool&. W reference jest operator konwersji na jedynie typ bool. Nie ma żadnej konwersji z reference na bool& i bool*.

Czemu nie ma błędu ?


(Sawyer47) #4

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.