tipos retorno procedimientos predefinidas parametros lenguaje funciones ejemplos creacion con c++ language-lawyer overload-resolution argument-deduction

c++ - retorno - tipos de funciones en c



¿Cómo funciona la deducción de argumentos de plantilla cuando una función sobrecargada está involucrada como un argumento? (1)

Como se señaló en la respuesta a su pregunta vinculada:

[temp.deduct.call]/6: cuando P es un tipo de función, puntero a tipo de función o puntero a tipo de función miembro:

- Si el argumento es un conjunto de sobrecarga que contiene una o más plantillas de función, el parámetro se trata como un contexto no deducido.

Dado que el conjunto de sobrecarga contiene una plantilla de función, el parámetro se trata como un contexto no deducido. Esto hace que la deducción del argumento de la plantilla falle:

[temp.deduct.type]/4: [...] Si un parámetro de plantilla se usa solo en contextos no deducidos y no se especifica explícitamente, la deducción de los argumentos de la plantilla falla.

Y esta deducción fallida te da tu error. Tenga en cuenta que si especifica explícitamente los argumentos, el código se compila correctamente:

bar<int,double>(foo);

Demo en vivo

Esta es la pregunta más sofisticada mencionada en ¿Cómo funciona la resolución de sobrecarga cuando un argumento es una función sobrecargada?

A continuación el código compila sin ningún problema :

void foo() {} void foo(int) {} void foo(double) {} void foo(int, double) {} // Uncommenting below line break compilation //template<class T> void foo(T) {} template<class X, class Y> void bar(void (*f)(X, Y)) { f(X(), Y()); } int main() { bar(foo); }

No parece ser una tarea desafiante para la deducción de argumentos de plantilla: solo hay una función foo() que acepta dos argumentos. Sin embargo, si no se comenta la sobrecarga de plantillas de foo() (que aún tiene un solo parámetro), se rompe la compilación sin ninguna razón obvia. La compilación falla tanto con gcc 5.x / 6.x como clang 3.9.

¿Puede explicarse por las reglas de resolución de sobrecarga / deducción de argumentos de la plantilla o debe calificarse como un defecto en esos compiladores?