当名称查找发现不同的声明时,ODR 违规
我一直在思考以下几点。考虑两个文件:
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?为什么?
I've been thinking of the following. Consider two files:
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); }
Without void g(int) {}
this program is 100% valid. With void g(int) {}
, g(1)
resolves to the template version in A.cpp and to the non-template in B.cpp.
Does this program violate ODR? Why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,确实如此。在
inline
函数的例外中,它指定不仅内联函数的定义应包含完全相同的标记序列,而且函数定义中命名函数定义之外的实体的所有相应标识符也应包含在内必须引用相同的实体(有一些小的例外,例如引用具有内部链接且允许使用相同定义的 const 对象)。 [参见 ISO/IEC 14882:2003 3.2/5]Yes, it does. In the exception for
inline
functions it's specified that not only shall the definitions of the inline function consist of exactly the same token sequence but that all the corresponding identifiers in the function definition which name entities outside of the function definition must refer to the same entity (with a few minor exceptions, such as referring to const objects with internal linkage with the same definition being allowed). [see ISO/IEC 14882:2003 3.2/5]