2011-07-19 11 views
7

To pytanie powstało z powodu niemożności użycia jednolitej składni inicjalizacyjnej ze słowem kluczowym auto, ponieważ traktuje to jako std::initializer_list<T> (wyjaśnienie w komentarzach here).Czy automatyczne używanie parens może oznaczać prototyp funkcji?

Weźmy następujący przykład kodu:

class X { }; 
int x(X()); // function prototype (1) 
auto x(X()); // copy/move construction of an X, function prototype or compile-time error? 

Jaki kompilator zrobić z auto x?

uzasadnienie każdego z możliwością:

konstrukcja skopiować/krok: można zobaczyć jest odpowiednia ze względu na zachowanie (1) są traktowane jako rodzaj wady.

Funkcja prototyp: Wydaje się nieprawdopodobne, ponieważ nie istnieje końcowy typ powrotu.

Błąd kompilacji: Jeśli kompilator analizuje to jako prototyp funkcji, może to spowodować błąd podczas kompilacji z powodu braku wstecznego typu powrotu.

Co standard C++ 0x mówi, że należy to interpretować jako?

Odpowiedz

6

uzyskać

error: 'x' function uses 'auto' type specifier without late return type 

Kompilator oczekuje czegoś jak

auto x(X()) -> int; 

co byłoby równoznaczne z linii 2.

+0

To wstyd. Dzięki. –

+2

Brzmi to jednak zgodnie ze starym zachowaniem w C++ 98, więc to dobrze. Jeśli chcesz zbudować 'x' z tymczasowego' X', powinieneś powiedzieć 'auto x ((X()));'. –

Powiązane problemy