Pregunta ¿Por qué C ++ puede deducir argumentos de plantilla en el lado derecho de un operador de asignación desde el lado izquierdo?


template <typename T>
void func(T&){
}

int main(){
    void (*p)(int&) = func;//or &func
    return 0;
}

Me pregunto por qué este código se compila (con g ++). Parece que el argumento de la función de plantilla se deduce del tipo de p? ¿Es este comportamiento estándar?

Editar: Se me ocurrió una posible explicación. Esa tarea tiene firma:

void(*&)(int&)operator=(void(*)(int&));

Así que func se deduce en realidad del tipo de argumento de entrada de operator =, en lugar del tipo de pag directamente. ¿Es eso correcto?


32
2017-12-22 10:03


origen


Respuestas:


¿Es este comportamiento estándar?

Sí lo es. La deducción de argumento de plantilla también ocurre cuando toma la dirección de una plantilla de función (como lo hace al asignar o inicializar un puntero de función). Está explícitamente permitido en [temp.deduct.funcaddr] / 1:

Los argumentos de la plantilla se pueden deducir del tipo especificado al tomar   la dirección de una función sobrecargada. La plantilla de la función   tipo de función y el tipo especificado se utilizan como los tipos de P y A,   y la deducción se hace como se describe en [temp.deduct.type].

El tipo de puntero a función proporciona el argumento (A en el párrafo anterior).

Entonces func se deduce en realidad del tipo de argumento de entrada de operator =, en lugar de del tipo de p directamente. ¿Es eso correcto?

Realmente no. Para empezar, no es una tarea, es la inicialización lo que estás haciendo. E incluso si estuviera usando una sobrecarga operator= función, necesitaría una deducción para inicializar el argumento para el operador de asignación, lo que lo lleva de vuelta al punto uno.


29
2017-12-22 10:07