我知道在代码中花括号不仅可以表示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 })
,会显然地调用第一个。如果我调用foo({ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } })
,则显然会调用第二个。
但是如果我调用:
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 };
都是正确的 示例。因此这是有歧义的。 - Jarod42{{1}}
可以匹配init_list<int>
,或者init_list<init_list<int>>
,甚至可以根据上下文匹配到std::array<char,1>
。 - Mooing Duck