为什么没有验证 "friend class" 是否存在?

Why is a "friend class" not verified for existence?

我曾经在class中将我的测试命名为class作为朋友进行测试,以启用测试私有字段。我注意到 class 的名称未被验证是否存在。是故意的吗?

Is it by intention?

我也这么认为。这很像一个前向声明。

通常 friend class 需要好友 class 的完整声明,但反之则不然。


要强制检查存在的(已声明的)类型,您可以使用

class MyClass {
    friend FriendClass;
};

所述。


作为旁注:
如何重构最不合适的好友模式,推荐你看我的问答post:How can I remove refactor a «friend» dependency declaration properly?

朋友 class 声明使用详细类型说明符 non-qualified class 的名称实际上是 [=18= class 的声明。它 引入 class 作为封闭命名空间的成员。它不需要 pre-declared

class C
{
  friend class X; // OK, introduces '::X'
};

但是如果您在朋友 class 声明中使用 合格的 名称,它将受到定期的合格名称查找。并且它必须引用先前声明的名称

class X {};

class C
{
  friend ::X; // OK, refers to '::X'
  friend ::Y; // Error, no '::Y' in sight
};

因此,如果您希望 class 名称为 "verified for existence",请在朋友声明中使用限定名称。

想象一下,如果朋友 ​​class 必须存在。你将如何构建你的代码?为了进行测试,您的代码中有该朋友声明。当您构建发布版本时,您不会发布测试代码,因此您必须删除友元声明并重新构建所有内容。现在您发布的代码与您测试的代码不同。