【问题标题】:Do two classes declarations differing from a friend class make an ODR violation?与朋友类不同的两个类声明是否违反了 ODR?
【发布时间】:2020-12-29 17:26:35
【问题描述】:

考虑a.hpp

class foo{
  int c;
};

b.hpp

class bar;
class foo{
  friend bar;

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

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

【问题讨论】:

  • “同班同学不同”他们没有任何区别,他们是相同的
  • 是的,但是第二类有一种通过bar访问私有数据的方法,第一类没有。
  • 为什么不在第一个?
  • @largest_prime_is_463035818:复制粘贴出错,第一个声明没有朋友,已编辑。

标签: c++ one-definition-rule


【解决方案1】:

是的。 ODR 很明确,来自cppreference(强调我的):

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

  • [...其他几点...]
  • 每个定义都由相同的标记序列 [...]
  • [...]

b.hppfoo 类中的第一个令牌定义“friend”令牌不同于 fooa.hpp 中定义的“int”令牌 - 仅此而已。请注意这一点的限制性 - 它谈论的是 tokens,甚至不涉及这些令牌的含义(但请注意,还有其他点有进一步的限制)。如果这两个头文件打算在两个要链接在一起的翻译单元中使用,则违反了 ODR。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 2023-03-30
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多