Uwielbiam auto
w C++ 11. To jest wspaniałe. Ale ma jedną niespójność, która naprawdę działa mi na nerwy, bo potknięcie się o niego cały czas:Dlaczego auto x {3} dedukuje listę initializer_list?
int i = 3; // i is an int with value 3
int i = int{3}; // i is an int with value 3
int i(3); // i is an int with value 3 (possibly narrowing, not in this case)
int i{3}; // i is an int with value 3
auto i = 3; // i is an int with value 3
auto i = int{3}; // i is an int with value 3
auto i(3); // i is an int with value 3
auto i{3}; // wtf, i is a std::initializer_list<int>?!
To dziwne zachowanie jest mylące dla początkujących i irytujące dla doświadczonych użytkowników - C++ ma dość drobne nieścisłości i ziemię przypadki, o których należy pamiętać tak jak jest. Czy ktoś może wyjaśnić, dlaczego komitet ds. Norm postanowił wprowadzić w tym przypadku nowy?
Mogłem to zrozumieć, jeśli zadeklarowanie zmiennej o typie std::initializer_list
było czymś, co było przydatne lub robione często, ale z mojego doświadczenia wynika, że prawie nigdy nie było celowe - aw rzadkich przypadkach, gdy tego chciałeś, każdy z
std::initializer_list<int> l{3};
auto l = std::initializer_list<int>{3};
auto l = {3}; // No need to specify the type
będzie działać dobrze. Więc jaki jest powód specjalnego przypadku dla auto x{i}
?
To właśnie dlatego [zasada ulegnie zmianie] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html). –
Powiązane: http://stackoverflow.com/q/17582667 – dyp
Rozwiązanie: nie używaj automatycznego dla żadnego z tych przypadków (z wyjątkiem # 2). :-) – dlf