Rozważmy poniższy kod:Domyślna wartość parametru widoczny w szablonie, ale to nie powinno (GCC)
#include <utility>
void f(int, int);
void g(int, int);
struct functor
{
template<typename... T>
void operator()(T&&... params)
{
return f(std::forward<T>(params)...);
}
};
int main()
{
functor()(1); // can use the default value here, why?!
// g(1); // error here as expected, too few arguments
}
void f(int a, int b = 42) {}
void g(int a, int b = 24) {}
Jest to cienka owijka wokół wywołania funkcji. Jednak wewnątrz functor::operator()
, f
nie ma domyślnej wartości dla drugiego znanego parametru (jest on widoczny w definicji po main
), więc kod nie powinien się kompilować. g ++ 5.2 kompiluje go pomyślnie chociaż, ale dzyń ++ wypluwa oczekiwany komunikat, że oczekuje na kompilatory, które wykonują nazwę dwufazowy odnośnika poprawnie:
error: call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup return f(std::forward(params)...);
Czy to gcc bug czy ja czegoś brakuje tutaj? Tj., Czy jest punktem tworzenia po definicji f
poniżej main()
? Ale nawet w tym przypadku nie powinno działać, ponieważ w drugim etapie funkcję można znaleźć tylko poprzez ADL, co nie ma miejsca w tym przypadku.
Koniec jednostki tłumaczeniowej jest również prawidłowym punktem tworzenia instancji. – Jarod42
Tak, ale nadal nie powinno działać, ponieważ w drugiej fazie wykonywane jest tylko ADL. – vsoftco
Jeśli wystąpi na końcu pliku, definicja 'f' z parametrem domyślnym jest widoczna ... Zastanawiam się, czy program nie jest źle sformułowany ... – Jarod42