与朋友 class 不同的两个 classes 声明是否构成 ODR 违规?

Do two classes declarations differing from a friend class make an ODR violation?

考虑a.hpp

class foo{
  int c;
};

b.hpp

class bar;
class foo{
  friend bar;

  // from here identical to a.hpp
  int c;
};

严格来说,这是否违反 ODR?

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

There can be more than one definition in a program of each of the following: class type, [...], as long as all of the following is true:

  • [... some other points...]
  • each definition consists of the same sequence of tokens [...]
  • [...]

class foo 定义中的第一个标记 b.hpp 中的“friend”标记不同于 class 中的“int”标记] foo a.hpp 中的定义——这就足够了。请注意这一点有多么严格——它谈论的是 令牌 ,甚至没有讨论这些令牌的含义(但请注意还有其他点有进一步的限制)。如果这两个头文件打算用于将要链接在一起的两个翻译单元,则违反了 ODR。