这是代码,我发现有关std :: initializer_list的一个奇怪的事情。 我使用vs2013。谢谢你的帮助。
struct TempStruct
{
int t1;
int t2;
};
int Test_A(int a, int b)
{
std::cout << " int a, int b" << '\n';
return 1;
}
TempStruct Test_A(std::initializer_list<int> a, std::initializer_list<int> b)
{
std::cout << "initializer_list" << '\n';
TempStruct Temp;
Temp.t1 = 1;
Temp.t2 = 2;
return Temp;
}
int main()
{
auto a_test = Test_A(1, 1);
auto b_test = Test_A({ 1 }, {});
return 1;
}
结果(std :: cout)我想:
int a, int b
initializer_list
来自vs2013的结果(std :: cout)
int a, int b
int a, int b
在vs2013 IDE中,如果我在“b_test”上移动鼠标,则显示b_test为TempStruct。构建后,结果不是。这是vs2013的错误还是错误使用了initializer_list?
答案 0 :(得分:1)
本声明:
Test_A({ 1 }, {});
可以解释为包含1且不包含任何内容的2个初始化列表,但也可以解释为:
Test_A(int{ 1 }, int{});
这就是所谓的统一初始化语法。 Intellisense有自己的“编译器”实现,并且经常在没有或显示错误类型的地方显示错误。新的C ++ 11功能会发生这种情况。
您可以尝试使用双括号来消除歧义:
Test_A({{ 1 }}, {{}});
我目前无法验证这一点,但Visual Studio和iPad混合得不是很好;)
您还应该考虑仅接受初始化列表并在仅传递1个项目时处理特殊情况,因为大多数调用者可能会混淆这两个重载之间的区别。