Considere este código:ADL y amigo inyección
template <int N>
struct X
{
friend void f(X *) {}
};
int main()
{
f((X<0> *)0); // Error?
}
compiladores parecen no estar de acuerdo en gran medida. (MSVC08/10 dice que no, GCC < 4.5 dice que sí, pero 4.5 dice que no, sun 5.1 dice sí, intel 11.1 dice que sí también, pero Comeau dice que no (ambos son EDG)).
De acuerdo con "plantillas de C++ - La guía completa":
... se supone que una llamada que implica una búsqueda de amigos en clases asociadas realmente causa la clase a una instancia .. . A pesar de que fue claramente intencionado por aquellos que escribieron el estándar C++, no es claramente explicado en el estándar.
No pude encontrar la sección correspondiente en la norma. ¿Alguna referencia?
considerar esta variación:
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 cuestión clave aquí es la función de carnero viable inyectado por X<1>
debe ser visible durante la ADL para X<0>
? ¿Están asociados? Todos los compiladores mencionados anteriormente aceptan este código, a excepción de Comeau que solo lo acepta en modo relajado. No estoy seguro de lo que el estándar tiene que decir sobre esto tampoco.
¿Cuál es su opinión sobre eso?
En caso de que el primer ejemplo sea compilable, entonces? – jpalecek
Gracias :) Esto es más o menos lo que sospechaba. ¿Cómo es que tantos compiladores se equivocan con el segundo caso? Además, lo agradecería si pudiera dar referencias al estándar para las otras citas también. – uj2
@ uj2 bueno, al menos clang se ve bien en comparación con GCC. Rechaza correctamente el segundo caso. Especialmente GCC tiene bastantes problemas de conformidad con la plantilla, así que esto no me sorprende. ¿Cuáles son las otras citas para las que intenta encontrar párrafos estándar? –