Considerare questo codice:ADL e amico iniezione
template <int N>
struct X
{
friend void f(X *) {}
};
int main()
{
f((X<0> *)0); // Error?
}
compilatori sembrano essere d'accordo pesantemente. (MSVC08/10 dice no, GCC < 4.5 dice sì, ma 4.5 dice no, sun 5.1 dice sì, intel 11.1 dice sì anche se comeau dice no (entrambi sono EDG)).
Secondo "Modelli C++ - La Guida Completa":
... si presume che una chiamata che coinvolge una ricerca per gli amici a classi associate fa sì che in realtà la classe da un'istanza .. Anche se questo era chiaramente inteso da coloro che ha scritto lo standard C++, non è chiaramente enunciato nello standard.
Non sono riuscito a trovare la sezione pertinente nello standard. Qualche riferimento?
Considerate questa variante:
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 questione chiave qui è che scendessimo la funzione vitale iniettato da X<1>
dovrebbe essere visibile durante ADL per X<0>
? Sono associati? Tutti i compilatori sopra menzionati accettano questo codice, ad eccezione di Comeau che lo accetta solo in modalità rilassata. Non sono sicuro di quello che lo standard ha da dire su questo.
Cosa ne pensi?
Il primo esempio deve essere compilabile? – jpalecek
Grazie :) Questo è più o meno quello che sospettavo. Come mai così tanti compilatori hanno sbagliato il secondo caso? Inoltre, lo apprezzerei se potessi fornire riferimenti nello standard anche per le altre citazioni. – uj2
@ uj2 beh, almeno il clang continua a sembrare buono rispetto a GCC. Rifiuta correttamente il secondo caso. Soprattutto GCC ha un bel po 'di problemi di conformità dei modelli, quindi questo non mi sorprende. Quali sono le altre citazioni che stai cercando di trovare per i paragrafi standard? –