Итак, я знаю, что фигурные скобки в коде могут означать больше, чем просто initializer_list
: Что такое список, заключенный в фигурные скобки, если не список инициализаторов?< /а>
Но что они должны использовать по умолчанию?
Например, предположим, что я определяю перегруженную функцию:
void foo(const initializer_list<int>& row_vector) { cout << size(row_vector) << "x1 - FIRST\n"; }
void foo(const initializer_list<initializer_list<int>>& matrix) { cout << size(matrix) << 'x' << size(*begin(matrix)) << " - SECOND\n"; }
Если я позвоню foo({ 1, 2, 3 })
, очевидно, будет вызван 1st. И если я позвоню foo({ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } })
, очевидно, будет вызван 2nd.
Но что, если я позвоню:
foo({ { 1 }, { 2 }, { 3 } })
Являются ли эти вложенные скобки int
-инициализаторами или initializer_list<int>
-инициализаторами? gcc говорит, что это неоднозначно Но если вы возьмете этот код и запустите его на http://webcompiler.cloudapp.net/ Visual Studio говорит, что просто создает файл initializer_list<int>
. Кто прав? Здесь должен быть дефолт?
int i = {42};
, иstd::initializer_list<int> ini = { 42 };
верны Демо. Так что неоднозначно. - person Jarod42   schedule 05.08.2016{ 1 }
, я думал, что мы должны сделатьint{ 1 }
. Если это так, Visual Studio кажется наиболее разумным. - person Jonathan Mee   schedule 05.08.2016{{1}}
может соответствоватьinit_list<int>
илиinit_list<init_list<int>>
, или дажеstd::array<char,1>
, в зависимости от контекста. - person Mooing Duck   schedule 05.08.2016cout << { 1 } << endl
является незаконным. Несмотря на то, что есть оператор вставки дляint
s. на мой взгляд, если вы прямо не указали тип, это не должен быть конструктор. Очевидно, что это делает инициализация, и, очевидно,int{ 1 }
делает это, но{ 1 }
, на мой взгляд, не делает этого. Я думаю об этом как оinitializer_list<int>
. - person Jonathan Mee   schedule 05.08.2016intializer_list<int>
, я в равной степени имел бы право инициализироватьint
, и, поскольку нет предпочтительного преобразования, это неоднозначно. - person Jonathan Mee   schedule 05.08.2016