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

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

A.cpp:

template<class T> void g(T) {}

inline void f() { g(1); }

Б.цпп:

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? Почему?


person Yakov Galka    schedule 16.05.2011    source источник
comment
Вот где действительно сияет механизм include :/   -  person Matthieu M.    schedule 16.05.2011
comment
@Matthieu: вот откуда возник вопрос.   -  person Yakov Galka    schedule 16.05.2011


Ответы (1)


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

person CB Bailey    schedule 16.05.2011