Использование std::initializer_list и int в качестве параметра функции вызывает "неправильный" перевод компилятора

Вот код, я нахожу странную вещь о 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

Результат (std::cout) от vs2013

int a, int b
int a, int b

В IDE vs2013, если я наведу указатель мыши на "b_test", он показывает, что b_test - это TempStruct. После сборки результата нет. Это ошибка vs2013 или неправильное использование initializer_list?

1 ответ

Это утверждение:

Test_A({ 1 }, {});

Может интерпретироваться как 2 списка инициализаторов, содержащих 1 и ничего не содержащих, но также может интерпретироваться как:

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

Это так называемый единый синтаксис инициализации. Intellisense имеет собственную реализацию "компилятора" и часто показывает ошибки там, где их нет, или показывает неправильные типы. Это часто случается с новыми функциями C++11.

Вы можете попробовать использовать двойные скобки для устранения неоднозначности:

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

Пока я не могу это проверить, Visual Studio и iPad не очень хорошо сочетаются;)

Вам также следует рассмотреть возможность принятия только списков инициализаторов и обрабатывать особый случай, когда передается только 1 элемент, так как большинство вызывающих абонентов, вероятно, будут сбиты с толку, в чем разница между этими двумя перегрузками.

Другие вопросы по тегам