Considérez ce code:ADL et injection ami
template <int N>
struct X
{
friend void f(X *) {}
};
int main()
{
f((X<0> *)0); // Error?
}
compilateurs semblent être en désaccord fortement. (MSVC08/10 dit non, GCC < 4,5 dit oui, mais 4,5 dit non, soleil 5.1 dit oui, Intel 11.1 dit oui aussi mais comeau dit non (les deux sont EDG)).
Selon « C++ Modèles - Le guide complet »:
... on suppose qu'un appel impliquant une recherche des amis dans classes associées provoque en fait la classe à instancier .. Bien que était clairement destiné par ceux qui ont écrit le standard C++, ce n'est pas clairement énoncé dans la norme.
Je n'ai pas trouvé la section pertinente dans la norme. Toute référence?
Tenir compte de cette variation:
template <int N>
struct X
{
template <int M>
friend void f(X<M> *) {}
};
template <>
struct X<0>
{
};
int main()
{
X<1>();
f((X<0> *)0); // Error?
}
La question clé ici est wether la fonction viable injectée par X<1>
doit être visible pendant ADL pour X<0>
? Sont-ils associés? Tous les compilateurs mentionnés ci-dessus acceptent ce code, à l'exception de Comeau qui ne l'accepte qu'en mode relâché. Je ne suis pas sûr de ce que la norme a à dire à ce sujet non plus.
Que pensez-vous de cela?
Le premier exemple devrait-il être compilable? – jpalecek
Merci :) C'est plus ou moins ce que je soupçonnais. Comment se fait-il que tant de compilateurs se trompent dans ce deuxième cas? En outre, je l'apprécierais si vous pouviez donner des références dans la norme pour les autres citations aussi. – uj2
@ uj2 Eh bien, au moins clang continue de paraître bien en comparaison de GCC. Il rejette correctement le deuxième cas. En particulier, GCC a un certain nombre de problèmes de conformité de modèles, ce qui ne me surprend pas. Quelles sont les autres citations que vous essayez de trouver des paragraphes standard pour? –