Мне нравится auto
в С++ 11. Это замечательно. Но у него есть одна непоследовательность, которая действительно нервничает, потому что я все время путешествую по ней:
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>?!
Это странное поведение запутывает для новичков и раздражает опытных пользователей - С++ имеет достаточно мало несогласованностей и угловых случаев, о которых нужно помнить, как есть. Может ли кто-нибудь объяснить, почему комитет по стандартизации решил ввести новый в этом случае?
Я мог бы понять это, если объявление переменной типа std::initializer_list
было чем-то полезным или часто выполняемым, но по моему опыту это почти никогда не было преднамеренным - и в тех редких случаях, когда вы действительно хотели это сделать, любой из
std::initializer_list<int> l{3};
auto l = std::initializer_list<int>{3};
auto l = {3}; // No need to specify the type
будет работать нормально. Итак, какова причина специального случая для auto x{i}
?