假设我有一个名为
对我来说,这似乎是不一致的。这是有原因的还是只是标准的设计决定?
F
的类,它应该是类 G
(在全局命名空间)和类 C
(在命名空间 A
中)的友元。
- 要成为
A::C
的友元,必须提前声明F
。 - 要成为
G
的友元,不需要提前声明F
。 - 同样,类
A::BF
可以成为A::C
的友元而无需提前声明。
class G {
friend class F;
int g;
};
// without this forward declaration, F can't be friend to A::C
class F;
namespace A {
class C {
friend class ::F;
friend class BF;
int c;
};
class BF {
public:
BF() { c.c = 2; }
private:
C c;
};
} // namespace A
class F {
public:
F() { g.g = 3; c.c = 2; }
private:
G g;
A::C c;
};
int main()
{
F f;
}
对我来说,这似乎是不一致的。这是有原因的还是只是标准的设计决定?
friend class ::F
"(如OP代码中所示),从而明确将F
推入全局命名空间。我认为答案是“限定符ID从未声明新名称”,但不确定标准对此问题的具体规定。 - zwolfriend class F
而不需要::
,甚至不需要提前声明class F;
它仍然会编译通过 ¯_(ツ)_/¯ - Kyrietfriend class F
而不需要::
,甚至不需要提前声明class F;
它也会编译通过 ¯_(ツ)_/¯ - undefined