Нарушение ODR, когда поиск по имени находит другое объявление - PullRequest
5 голосов
/ 16 мая 2011

Я думал о следующем. Рассмотрим два файла:

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); }

Без void g(int) {} эта программа действует на 100%. С void g(int) {}, g(1) преобразуется в версию шаблона в A.cpp и в не шаблон в B.cpp.

Эта программа нарушает ODR? Почему?

1 Ответ

7 голосов
/ 16 мая 2011

Да, это так. В исключении для функций inline указано, что определения встроенной функции должны не только состоять из одной и той же последовательности токенов, но и что все соответствующие идентификаторы в определении функции, имена объектов которых находятся вне определения функции, должны ссылаться на одно и то же. Сущность (с некоторыми незначительными исключениями, такими как ссылка на const-объекты с внутренней связью с тем же разрешенным определением). [см. ИСО / МЭК 14882: 2003 3.2 / 5]

...