5

我一直在思考以下问题。考虑两个文件:

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?为什么?

4

1 回答 1

7

是的,它确实。在inline函数的例外中,它指定不仅内联函数的定义应包含完全相同的标记序列,而且函数定义中命名函数定义之外的实体的所有相应标识符必须引用相同的实体(使用一些小的例外,例如引用具有相同定义的内部链接的 const 对象)。[见 ISO/IEC 14882:2003 3.2/5]

于 2011-05-16T07:40:33.340 回答