ODR-Verstoß, wenn die Namenssuche eine andere Deklaration findet
-
14-11-2019 - |
Frage
Ich habe an Folgendes gedacht.Betrachten Sie zwei Dateien:
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); }
Ohne void g(int) {}
Dieses Programm ist zu 100 % gültig.Mit void g(int) {}
, g(1)
wird in A.cpp in die Vorlagenversion und in B.cpp in die Nicht-Vorlagenversion aufgelöst.
Verstößt dieses Programm gegen ODR?Warum?
Lösung
Ja tut es.In der Ausnahme für inline
Funktionen wird festgelegt, dass nicht nur die Definitionen der Inline-Funktion aus genau derselben Token-Sequenz bestehen sollen, sondern dass alle entsprechenden Bezeichner in der Funktionsdefinition, die Entitäten außerhalb der Funktionsdefinition benennen, auf dieselbe Entität verweisen müssen (mit einigen kleineren Ausnahmen). , z. B. Verweis auf const-Objekte mit interner Verknüpfung, wobei dieselbe Definition zulässig ist).[siehe ISO/IEC 14882:2003 3.2/5]