名称查找找到不同的声明时违反 ODR

ODR violation when name-lookup finds a different declaration

本文关键字:声明 ODR 查找      更新时间:2023-10-16

我一直在想以下几点。考虑两个文件:

答.cpp:

template<class T> void g(T) {}
inline void f() { g(1); }

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

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