Non type de paramètres de modèle
Je comprends que le non-type de modèle paramètre doit être une constante expression intégrale. Quelqu'un peut-il éclairer pourquoi est-il si ?
template <std::string temp>
void foo()
{
//...
}
error C2993: 'std::string' : illegal type for non-type template parameter 'temp'.
Je comprends ce qu'est une constante expression intégrale est. Quelles sont les raisons de ne pas autoriser les non-constante des types comme std::string
comme dans l'extrait ci-dessus ?
- Un paramètre du modèle est résolu au moment de la compilation.
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle vous ne pouvez pas le faire c'est parce que les expressions constantes ne peuvent pas être analysées et remplacé lors de la compilation. Ils pourraient changer au cours de l'exécution, ce qui nécessiterait la création d'un nouveau modèle en cours d'exécution, ce qui n'est pas possible parce que les modèles sont un moment de la compilation concept.
Voici ce que la norme permet la non-type de paramètres du modèle (14.1 [temp.param] p4):
Qui n'est pas autorisé.
Toutefois, il est permis de:
Voir §14.1/6,7,8 en C++ Standard (2003).
Illustration:
De sortie:
std::string
pointeur ou une référence d'objet. Si cette variable est locale, vous peut-être obtenir des adresses différentes à chaque fois que la fonction a été appelée.Vous devez être capable de coder les arguments de modèle
Maintenant une impl aurait besoin de venir avec une unique séquence de caractères pour un
std::string
ou, d'ailleurs, toutes les autres arbitraire défini par l'utilisateur de la classe, de stocker une valeur particulière, dont le sens n'est pas connu pour la mise en œuvre. Et en plus, la valeur de l'arbitraire des objets de la classe ne peut pas être calculé au moment de la compilation.Il est prévu d'envisager de permettre littérale types de classe en tant que modèle des types de paramètres pour la post-C++0x, qui sont initialisés par des expressions constantes. Ceux-ci pourraient être déformés par le fait d'avoir les membres de données de façon récursive de déformation en fonction de leurs valeurs (pour les classes de base, par exemple, nous pouvons appliquer la profondeur de la première, de gauche à droite de la traversée). Mais il est certainement ne va pas au travail pour arbitraire classes.
Un non-type de modèle argument fourni à l'intérieur d'un modèle de liste d'arguments est une expression dont la valeur peut être déterminée au moment de la compilation. Ces arguments doivent être:
Aussi, les littéraux de chaîne sont des objets ayant une liaison interne, de sorte que vous ne pouvez pas les utiliser comme arguments de modèle. Vous ne pouvez pas utiliser un pointeur global, soit. Virgule flottante littéraux ne sont pas autorisés, compte tenu de la possibilité évidente de l'arrondissement des erreurs.