Si consideri il seguente frammento:Dipendente ricerca dei nomi in funzione di modello: clang rifiuta, gcc accetta
struct X { };
namespace foo {
template <class T>
void bar() { T{} < T{}; }
void operator<(const X&, const X&) {}
}
int main() {
foo::bar<X>();
}
clang rifiuta questo codice, gcc accetta. È un bug di gcc o è un bug clang?
Non vedo come sia un errore perché il tipo "T" può riferirsi a qualsiasi tipo. Se quel tipo 'T' non sovraccarica o supporta l'operatore' <'allora la funzione' bar' fallirebbe. Dato che hai sovraccaricato l'operatore '<', va tutto bene. Immagino che tutto dipenda dal modo in cui i compilatori leggono il codice, ma la semantica non è soggetta a errori. – Poriferous
@Poriferous Che non ha alcun senso. La domanda riguarda tutto il comportamento corretto di 'bar()' per tipi 'T' che non hanno' operator <'. Il comportamento corretto è: "sì, trova' bar :: operator <'" (nel qual caso, clang ha un bug) o "il codice è mal formato" (nel qual caso gcc ha un bug). – Barry
Questo non ha senso perché 'bar' è una funzione e non ha un membro' operator <'. Dato che hai definito l'operatore <'per struct' X', non vedo davvero quale sia il problema qui. Anche se il sovraccarico dell'operatore fosse incorporato nella struttura 'X', il codice dovrebbe comunque essere compilato correttamente. Per essere onesti, è clang che ha il bug dal momento che sembra assumere quale sia un tipo. Voglio dire, hai provato a sostituire 'foo :: bar()' con qualcosa come 'foo :: bar ()' e vedere se clang rifiuta anche quel codice? –
Poriferous