Wysiłek standaryzacyjny z decltype
był herkulesowym wysiłkiem obejmującym wiele lat. Było 7 wersji tego artykułu, zanim komisja ostatecznie go zaakceptowała. Wersje były:
ciekawe, nasiona zachowania których mowa, są w pierwszej rewizji: N1478, która wprowadza konieczność „dwóch rodzajów typeof. Albo w celu zachowania lub spadać odwołań w rodzaju”
Ten papier idzie dać uzasadnienie dla wariantu odniesienia do konserwacji, w tym ten cytat:
Z drugiej strony, semantyka referencyjne upuszczanie nie dostarcza mechanizm dokładnie wyrażając powrót typy ogólnych funkcji , jak wykazał Strouscutrup [Str02]. To implikuje, że , który upuszczałby literę referencyjną, powodowałoby problemy dla autorów bibliotek generycznych .
Nie ma substytutu do czytania w tych dokumentach. Jednak można podsumować, że decltype
służy dwóm celom:
- Aby zgłosić zadeklarowany typ identyfikatora.
- Aby zgłosić typ wyrażenia.
Dla drugiego przypadku użycia przypomnij, że wyrażenia nie są typami odniesienia, ale zamiast tego są jedną z wartości l, xvalue lub prvalues. Zgodnie z konwencją, gdy decltype
zgłasza typ wyrażenia lwartości, powoduje, że typ jest referencją o wartości l, a gdy wyrażenie jest wartością x, raportowany typ staje się referencją rwartości.
W twoim przykładzie *ap
jest wyrażeniem, podczas gdy a
jest identyfikatorem. Tak więc twój przykład wykorzystuje oba przypadki użycia, jak po raz pierwszy wprowadzono w N1478.
Należy również pamiętać, że decltype
nie został zaprojektowany w izolacji. Reszta języka C++ ewoluowała w tym okresie czasu (na przykład odniesienia rvalue), a projekt decltype
został powtórzony, aby dotrzymać kroku.
Należy również zauważyć, że po przyjęciu propozycji decltype
, kontynuowała ona (i trwa do dnia dzisiejszego) ewoluowanie. Zobacz tę listę zagadnień:
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_index.html
konkretnie punkt 7.1.6.2 (co jest sekcja gdzie większość specyfikacji życiu decltype
).
Zakładam, że już wiesz :), ale dla rekordu możesz to zmienić, używając 'std :: remove_reference' lub' std :: remove_pointer'. – 101010
@ 40two, tak, znam te narzędzia. Próbuję zrozumieć, dlaczego język jest zdefiniowany tak, jak jest. –
Wiedziałem, że znasz to, ponieważ jesteś zwykłym podejrzanym w tych lokalach. Głównym powodem, dla którego mogę myśleć, jest użycie "decltype" w zwrocie powrotu. Usunięcie '&' z typu byłoby niewygodne w podejściu powrotnym. – 101010