我一直在考虑以下问题。考虑两个文件:
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?为什么呢?
答案 0 :(得分:7)
是的,确实如此。在inline
函数的例外情况中,它指定内联函数的定义不仅应由完全相同的标记序列组成,而且函数定义中所有相应的标识符(在函数定义之外命名实体)必须引用同一个实体(有一些小的例外,例如引用具有内部链接的const对象,允许相同的定义)。 [见ISO / IEC 14882:2003 3.2 / 5]