0

C++fonction modèle paramètre par défaut et l'inférence de type

Aucune de ces fonctions de modèle

template<typename T> void foo(T par = nullptr) {return;} //#1 
template<typename T> void foo(T par = std::nullptr_t(nullptr)) {return;} //#2 
template<typename T> void foo(T par = int(0)) {return;} //#3 

rien laisser à l'appel sans argument suivant pour compilent:

foo(); 

bien appeler foo avec n'importe quelle valeur fonctionne (par exemple foo(2)).

nullptr a un type spécifique, qui est std::nullptr_t, donc je ne pensais pas que le paramètre par défaut nécessitait une qualification de type supplémentaire en # 1. Le type du paramètre par défaut est explicitement fourni dans # 2 et # 3, donc je ne pensais pas qu'il y avait une ambiguïté de type là-bas.

Quel est le problème ici? Y a-t-il un moyen approprié de faire les paramètres par défaut avec les fonctions du modèle?

Répondre

1

Vos exemples ne fonctionnent pas car la déduction des arguments de modèle échoue pour foo(). Avec 11 C++ vous êtes autorisé à spécifier des arguments de modèle par défaut pour les modèles de fonction, de sorte que vous modifiez la définition de

template<typename T = void*> void foo(T par = nullptr) {return;} 

Avec 03 C++ Je ne connais pas d'autre moyen que de spécifier explicitement la argument de modèle.

La raison pour laquelle l'argument template n'est pas déduit de l'argument par défaut est que l'état standard est un contexte non déduit.

De N3691, §14.8.2.5/5

Les contextes non déduits sont:

...

- Un paramètre de modèle utilisé dans le type de paramètre d'une fonction paramètre qui a un argument par défaut qui est utilisé dans l'appel pour lequel la déduction d'argument est en cours.

Questions connexes