Pytanie Almost Always decltype (auto)?


decltype(auto) może wydedukować a wartość i a odniesienie. auto nigdy nie dedukuje a odniesienie. Brzmi dla mnie ogólny kod i optymalizacja decltype(auto) zawsze powinien być preferowany. Czy tak jest? Rozważmy na przykład zwrot przedmiotu, który może być kopiowany lub nie. auto& jest wymagane, aby go nie kopiować, ale wymusza to zawsze odwołanie. decltype(auto) jest prawidłową opcją w tym przypadku. Jakie są wady decltype(auto) oprócz bycia bardziej piszącym na maszynie?


11
2017-12-26 03:07


pochodzenie


Jeśli odpowiedź poniżej odpowiedział Twoje pytanie, jak działa przepełnienie stosu, możesz "zaakceptować" odpowiedź, klikając zaznaczenie obok niej. Jeszcze tutaj. Jeśli nie, może zamieścić komentarz na pytanie z prośbą o wyjaśnienia. - T.J. Crowder


Odpowiedzi:


Od najczęściej zadawanych pytań dotyczących isocpp C ++ 14 decltype(auto):

Uwaga: decltype (auto) jest przede wszystkim użyteczne do dedukowania zwracanego typu funkcji forwardujących i podobnych wrapperów, jak pokazano powyżej, gdzie chcesz, aby typ dokładnie "śledził" jakieś wyrażenie, które wywołujesz. Jednakże, decltype (auto) nie ma być szeroko wykorzystywaną funkcją poza tym. W szczególności, chociaż można go użyć do zadeklarowania zmiennych lokalnych, to jest to prawdopodobnie tylko antipattern, ponieważ odwołanie do zmiennej lokalnej nie powinno zależeć od wyrażenia inicjującego. Ponadto jest wrażliwy na sposób pisania instrukcji return. Te dwie funkcje mają różne typy zwrotu. look_up_a_string_1 zwraca a string podczas look_up_a_string_2 zwraca a string&.

decltype(auto) look_up_a_string_1() { auto str = lookup1(); return str; }
decltype(auto) look_up_a_string_2() { auto str = lookup1(); return(str); }

9
2017-12-26 04:22