Использование 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 элемент, так как большинство вызывающих абонентов, вероятно, будут сбиты с толку, в чем разница между этими двумя перегрузками.