Почему auto x {3} выводит initializer_list?

я люблюauto в C ++ 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>?!

Это странное поведение сбивает с толку новичков и раздражает опытных пользователей - в C ++ достаточно мало несоответствий и угловых случаев, о которых нужно помнить как есть. Кто-нибудь может объяснить, почему комитет по стандартам решил ввести новый в этом случае?

Я мог бы понять это, если объявить переменную типа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}?

Ответы на вопрос(1)

Ваш ответ на вопрос