Следующая программа не компилируется:
template <unsigned int dim, unsigned int N, bool P, bool C, class... ParametersType>
void test(ParametersType&&... par)
{
}
int main()
{
test<2, 3, true, false>(2, 1, {8, 8});
}
См. live на Coliru .
Сообщение об ошибке
g++ -std=c++17 -O1 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'int main()':
main.cpp:8:41: error: too many arguments to function 'void test(ParametersType&& ...)
[with unsigned int dim = 2; unsigned int N = 3; bool P = true; bool C = false; ParametersType = {}]'
8 | test<2, 3, true, false>(2, 1, {8, 8});
| ^
main.cpp:2:6: note: declared here
2 | void test(ParametersType&&... par)
| ^~~~
указывает что пакет параметров ParametersType...
выводится в пустой, в то время как я ожидаю, что он будет выводиться в соответствии с типами аргументов, передаваемых в test
.
Проблема в параметре {8, 8}
перешел на test
. Явная передача std::array
в функцию решает проблему:
#include <array>
template <unsigned int dim, unsigned int N, bool P, bool C, class... ParametersType>
void test(ParametersType&&... par)
{
}
int main()
{
test<2, 3, true, false>(2, 1, std::array<int, 2>{8, 8});
}
Посмотрите на это в прямом эфире на Coliru .
Почему компилятор, по-видимому, неправильно выводит пакет в первый пример?
Если компилятор не может вывести {8, 8}
в std::array
, я бы ожидал ошибку "невозможно вывести". Почему вместо этого компилятор выводит пакет в пустой?