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?

- Rejestracja:prawie 14 lat
- Ostatnio:około 4 lata
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
).
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:prawie 14 lat
- Ostatnio:około 4 lata
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.
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.
Zauważyłem ciekawą rzecz:
http://ideone.com/tbtiUh
skąd to "4test" ?

- Rejestracja:prawie 14 lat
- Ostatnio:około 4 lata
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.
Jestem pod wrażeniem Twojej wiedzy. Dzięki jeszcze raz ; )

satirev