http://en.cppreference.com/w/cpp/language/auto
użycie 2: jeśli dobrze rozumiem, to auto w tym przypadku jest jedynie częscią składni i nie spełnia swojego zadania jak w innym, typowym jego użyciu.
auto foo () -> zwracany_typ
jest tym samym, co
zwracany_tym foo()
Mam rację? Jeśli tak, to jakie są korzysci stosowania pierwszego wariantu?
Specyfikator auto
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
auto użyte w kontekście typu zwracanego przez funkcję nie używa auto type deduction. To jaki rodzaj dedukcji typu zostanie użyty zależy od formy zapisu. Jeśli użyjemy trailing return type syntax, tzn. podamy -> decltype(foo) to do dedukcji typu zostanie użyte decltype. Jeśli piszemy w C++14 i napiszemy coś w stylu:
auto foo() { return 1; }
to do zadziała template type deduction.
Często nie chcemy używać template type deduction, tylko delctype type deduction (np. żeby nie gubić referencji). W takim wypadku możemy użyć decltype(auto). Oznacza to po prostu, że typ ma zostać wydedukowany przez kompilator i do dedukcji tego typu kompilator ma użyć reguł decltype zamiast template.
Odpowiadając na pytanie - jakie są korzyści z stosowania zapisu z auto. Wszędzie tam, gdzie typ zwracany przez funkcję jest zależny od typu parametrów przesłanych do tej funkcji. Dla przykładu mamy szablonową funkcję liczącą iloczyn dwóch wartości (w szczególności o różnych typach). Nie możemy przewidzieć jaki typ powinniśmy zwrócić, bo nie wiemy jakie parametry zostaną przesłane do tej funkcji. W takim wypadku możemy przekazać odpowiedzialność za wydedukowanie poprawnego typu na kompilator (via trailing return type syntax).
- Rejestracja: dni
- Ostatnio: dni
Ekstra, jeszcze jedno pytanie. Użycie auto do określenia typu parametrów w deklaracji funkcji nie jest dozwolone ani w C++11, ani w C++14, tak mówi standard języka. Dlaczego? Jeśli ma to mocne uzasadnienie, to dlaczego niektóre kompilatory na to zezwalają? I właściwie - dlaczego miałoby to być źle? Dedukcja typu jest w tym przypadku równie prosta i oczywista jak przy zwykłym inicjalizowaniu zmiennych.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Szczecin
- Postów: 500
możesz używać dedukcji w programowaniu templatkowym, jak i w lambdach(c++14)
- Rejestracja: dni
- Ostatnio: dni
Sprawa jest prosta. Pisząc np. taki kod:
void foo(auto bar)
{
bar + 1;
}
zakładasz, że kompilator mógłby wydedukować typ bar na podstawie tego z czym wywołamy foo. Innymi słowy chciałbyś, żeby kompilator w magiczny sposób z zwykłej funkcji zrobił szablon. Przez wzgląd na to, że szablony mocno różnią się od "zwykłych" funkcji powodowałoby to stosowanie dla "normalnych" funkcji reguł jak dla template, np. two-phase look-up. W każdym razie tak jak już wspomniałeś część kompilatorów pozwala na taki zapis, np. g++ i nad tym można jedynie ubolewać.
Uwaga: Jeśli działasz na g++ to kompiluj z flagą -Wpedantic, dostaniesz chociaż warning o tym, że auto jako parametr funkcji nie jest dozwolone.
- Rejestracja: dni
- Ostatnio: dni
Właściwie to dostaje
błąd: 'foo' function uses 'auto' type specifier without trailing return type
auto foo (auto bar) {
^
deduced return type only available with -std=c++1y or -std=gnu++1y
Poza tym - wkradł się błąd do -Wpedantic w Twoim poście. Dzięki wielkie za rozjaśnienie sprawy.
- Rejestracja: dni
- Ostatnio: dni
Zauważyłem ciekawą rzecz:
http://ideone.com/tbtiUh
skąd to "4test" ?
- Rejestracja: dni
- Ostatnio: dni
To co zwróci std::type_info::name jest zależne od implementacji (czyli w przypadku różnych kompilatorów możesz dostać różne wyniki). To co dostałeś w w outputcie to wyniki tzw. name mangling. Jest to technika polegająca na generowaniu unikatowych nazw dla typów. Jeśli chciałbyś uzyskać "normalną" nazwę to mógłbyś użyć odwrotnej techniki demangling przy pomocy np. c++filt.