使用std :: initializer_list和int作为函数参数会导致编译器“错误”翻译

时间:2014-03-03 05:58:45

标签: c++11 initializer-list

这是代码,我发现有关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?

1 个答案:

答案 0 :(得分:1)

本声明:

Test_A({ 1 }, {});

可以解释为包含1且不包含任何内容的2个初始化列表,但也可以解释为:

Test_A(int{ 1 }, int{});

这就是所谓的统一初始化语法。 Intellisense有自己的“编译器”实现,并且经常在没有或显示错误类型的地方显示错误。新的C ++ 11功能会发生这种情况。

您可以尝试使用双括号来消除歧义:

Test_A({{ 1 }}, {{}});

我目前无法验证这一点,但Visual Studio和iPad混合得不是很好;)

您还应该考虑仅接受初始化列表并在仅传递1个项目时处理特殊情况,因为大多数调用者可能会混淆这两个重载之间的区别。