En répondant à this SO question, j'ai trouvé dans le standard (déjà C++ 03, toujours en C++ 11) que vous ne pouvez utiliser des adresses que comme arguments de template non-type s'ils sont de le formulaire & id-expression
(plus quelques exceptions). Mais je ne pouvais pas répondre pourquoi c'est le cas.pointeur en tant qu'argument de modèle non-type
14.3.2 Template arguments non de type [temp.arg.nontype]
Un modèle argument pour un non-type, le modèle à paramètres non-template est l'un de:
[...]
- une expression constante (5,19) qui désigne l'adresse d'un objet avec une mémoire statique> durée et la liaison externe ou interne ou une fonction de liaison externe ou interne, y compris les modèles de fonction et modèle de fonction -ids mais exc lissant les membres de classe non statiques, exprimés (en ignorant les parenthèses) & id-expression, sauf que le & peut être omis si le nom fait référence à une fonction ou un tableau et doit être omis si le paramètre de modèle correspondant est une référence; [...]
(n3485, moi qui souligne)
Exemple:
using TFoobar = int (*)();
template < TFoobar tp > struct foo_struct{};
int foobar() { return 42; }
constexpr TFoobar pFoobar = &foobar;
foo_struct < &foobar > o0; // fine
foo_struct <pFoobar> o1; // ill-formed
Je suppose qu'il a quelque chose à voir avec les phases de traduction, à savoir le compilateur ne sait pas grand-chose à propos des adresses. Pourtant, pourquoi n'est-ce pas autorisé? Ne devrait-il pas être possible pour le compilateur d'utiliser quelque chose de similaire à la substitution de macro pour remplacer pFoobar
par &foobar
?
Très bonne question. –
Je suppose qu'il s'agit de faire des changements conservateurs.C++ 11 est plein de manières très strictes pour que le langage fasse les choses afin de rendre les choses plus faciles pour les implémenteurs du compilateur. Il pourrait être possible d'étendre C++ 11 pour permettre ce qui précède, mais c'est une question pour C++ 14 ou au-delà! – Yakk
[Il existe une proposition] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4268.html) pour supprimer ces restrictions. – dyp