Из-за 8.3.6 ([dcl.fct.default]) / 4 ,
В данном объявлении функции каждый параметр, следующий за параметром со значением по умолчанию Аргумент должен иметь аргумент по умолчанию, предоставленный в этом или предыдущем объявлении, или должен быть пакетом параметров функции.
следующее должно компилироваться:
#include <iostream>
template<typename ...Ts>
void foo(int i=8, Ts... args)
{
std::cout << "Default parameters \t= " << i << "\n";
std::cout << "Additional params \t= " << sizeof...(Ts) << "\n";
}
int main()
{
foo(); // calls foo<>(int)
foo(1, "str1", "str2"); // calls foo<const char*, const char*>(int, const char*, const char*)
foo("str3"); // ERROR: does not call foo<const char*>(int, const char*)
return 0;
}
Но оно не компилируется из-за на foo("str3")
, что смущает компилятор. Он жалуется, что не существует соответствующей функции для вызова foo(const char*)
и что он не может преобразовать "str3"
(тип const char*
) в тип int
.
Я понимаю, что можно обойти эту проблему, прибегают к перегрузке функции или используют именованный параметр-идиому (ср. , где поместить параметр значения по умолчанию в функцию переменной длины в c ++? и аргументы по умолчанию и variadi c функции ). Однако я хотел бы знать, является ли компилятор просто глупым или есть подлинная причина, почему предполагаемое поведение в приведенном выше примере кода не реализовано. Другими словами, почему компилятор жалуется, даже если я явно создаю экземпляр функции как foo<const char*>(int, const char*)
? Это как если бы явная реализация просто игнорировала значение параметра по умолчанию. Почему?