32 votes

Pourquoi C ++ peut-il déduire des arguments de modèle sur le côté droit d'un opérateur d'affectation sur le côté gauche?

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

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

Je me demande pourquoi ce code est compilé (avec g ++). Il semble que l’argument de la fonction template soit déduit du type de p? Est-ce que ce comportement standard?

Modifier: Je suis venu avec une explication possible. Cette cession a une signature:

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

Donc, func est en fait déduit de l'argument d'entrée du type opérateur =, plutôt que du type de p directement. Est-ce exact?

29voto

StoryTeller Points 6139

Est-ce un comportement standard?

Oui, il est. Argument de modèle déduction également qui se passe quand vous prenez l'adresse d'un modèle de fonction (comme vous le faites lors de l'attribution ou de l'initialisation d'un pointeur de fonction). C'est explicitement autorisé dans [temp.déduire.funcaddr]/1:

Arguments de modèle peut être déduit du type spécifié lors de la prise de l'adresse d'une fonction surchargée. La fonction du modèle type de fonction et le type spécifié sont utilisés comme les types de P et A, et la déduction est effectuée comme décrit dans [temp.déduire.type].

Le pointeur de fonction type fournit l'argument (A dans le paragraphe ci-dessus).

Si func est en fait déduite à partir de l'argument d'entrée type de l'opérateur=, plutôt que de type de p directement. Est-ce exact?

Pas vraiment. Pour l'un, ce n'est pas une cession, c'est d'initialisation que vous êtes en train de faire. Et même si c'est à l'aide d'une surchargé operator= fonction, vous auriez besoin de la déduction pour initialiser l'argument de l'opérateur d'affectation, qui vous ramène à la case départ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X