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?
To wstyd. Dzięki. –
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()));'. –