当名称查找发现不同的声明时,ODR 违规

发布于 2024-11-08 03:38:53 字数 410 浏览 0 评论 0原文

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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

儭儭莪哋寶赑 2024-11-15 03:38:53

是的,确实如此。在 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]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文