Использование 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;
}
</int></int>

Результат (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 имеет свою собственную реализацию "компилятора" и часто показывает ошибки, где их нет или отображаются неправильные типы. Это очень часто связано с новыми возможностями С++ 11.

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

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

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

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

licensed under cc by-sa 3.0 with attribution.