Specyfikator auto

0

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?

4

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

0

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.

1

możesz używać dedukcji w programowaniu templatkowym, jak i w lambdach(c++14)

1

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.

0

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.

0

Zauważyłem ciekawą rzecz:
http://ideone.com/tbtiUh
skąd to "4test" ?

3

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.

0

Jestem pod wrażeniem Twojej wiedzy. Dzięki jeszcze raz ; )

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0