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?

War es hilfreich?

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]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top