与友元类不同的两个类声明是否会违反 ODR?

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?

Kam*_*Cuk 5

是的。ODR 很清楚,来自cppreference(强调我的):

程序中可以有多个以下各项的定义:类类型、[...],只要满足以下所有条件:

  • [...其他一些要点...]
  • 每个定义都由相同的标记序列组成[...]
  • [...]

“ ”标记中的类foo定义中的第一个标记与类定义中的“ ”标记不同- 仅此就足够了。请注意这一点的限制性 - 它讨论的是token,甚至没有讨论这些 token 的含义(但请注意,还有其他点有进一步的限制)。如果这两个头文件要在要链接在一起的两个翻译单元中使用,则会违反 ODR。b.hppfriendintfooa.hpp