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é?

È stato utile?

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]

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top