fek*_*kir 1 c++ one-definition-rule
考虑a.hpp
class foo{
int c;
};
Run Code Online (Sandbox Code Playgroud)
和b.hpp
class bar;
class foo{
friend bar;
// from here identical to a.hpp
int c;
};
Run Code Online (Sandbox Code Playgroud)
严格来说,这是否违反 ODR?
是的。ODR 很清楚,来自cppreference(强调我的):
程序中可以有多个以下各项的定义:类类型、[...],只要满足以下所有条件:
- [...其他一些要点...]
- 每个定义都由相同的标记序列组成[...]
- [...]
“ ”标记中的类foo定义中的第一个标记与类定义中的“ ”标记不同- 仅此就足够了。请注意这一点的限制性 - 它讨论的是token,甚至没有讨论这些 token 的含义(但请注意,还有其他点有进一步的限制)。如果这两个头文件要在要链接在一起的两个翻译单元中使用,则会违反 ODR。b.hppfriendintfooa.hpp
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |