ODR Violazione Quando Name-Lookup trova una dichiarazione diversa
-
14-11-2019 - |
Domanda
Ho pensato a quanto segue.Considera due file:
A.CPP:
template<class T> void g(T) {}
inline void f() { g(1); }
.
B.CPP:
template<class T> void g(T) {}
void g(int) {}
inline void f() { g(1); }
.
Senza void g(int) {}
Questo programma è valido al 100%.Con void g(int) {}
, g(1)
si risolve nella versione del modello in A.CPP e al modello non modello in B.CPP.
Questo programma viola ODR?Perché?
Soluzione
Sì, lo fa.All'eccezione per le funzioni inline
è specificata che non solo le definizioni della funzione in linea consistono nella stessa sequenza di token, ma che tutti gli identificatori corrispondenti nella definizione della funzione quali entità al di fuori della definizione della funzione devono fare riferimento alla stessa entità (Con alcune piccole eccezioni, come il riferimento a oggetti const con collegamento interno con la stessa definizione consentita).[Vedi ISO / IEC 14882: 2003 3.2 / 5]