访问好友私有成员的好友函数 class
A friend function accessing a private member of a friend class
正在关注 the Czech song from Eurovision 2019 in Tel-Aviv
众所周知,在 C++ 中,朋友的朋友不是(自动)朋友。
然而,Clang 在以下代码上与 GCC 和 MSVC 不同:
class A {
public:
// forward declaration
class Inner2;
private:
class Inner1 {
char foo;
friend class Inner2;
};
public:
class Inner2 {
Inner1 i;
public:
bool operator==(Inner2 other) {
return i.foo == other.i.foo; // OK by GCC, Clang and MSVC++
}
friend bool operator!=(Inner2 a, Inner2 b) {
return a.i.foo != b.i.foo; // Clang accepts, GCC and MSVC++ reject
}
};
};
代码:https://godbolt.org/z/rn48PTe1Y
哪个是正确的?
如果 Clang 过于宽容是错误的,允许访问的最佳方式是什么(除了提供 public getter?)
注意:如果友元函数只是在class中声明并在外部实现,both Clang and GCC reject the code.
好像是 a known defect in clang, bug id #11515,2011 年就已经报告了,但显然还没有修复。
一个编译但不应该编译的更简单的示例(来自上面的错误报告):
class A {
int n;
friend struct B;
};
struct B {
friend int get(A &a) {
return a.n; // clang accepts, and should reject
}
};
正在关注 the Czech song from Eurovision 2019 in Tel-Aviv
众所周知,在 C++ 中,朋友的朋友不是(自动)朋友。
然而,Clang 在以下代码上与 GCC 和 MSVC 不同:
class A {
public:
// forward declaration
class Inner2;
private:
class Inner1 {
char foo;
friend class Inner2;
};
public:
class Inner2 {
Inner1 i;
public:
bool operator==(Inner2 other) {
return i.foo == other.i.foo; // OK by GCC, Clang and MSVC++
}
friend bool operator!=(Inner2 a, Inner2 b) {
return a.i.foo != b.i.foo; // Clang accepts, GCC and MSVC++ reject
}
};
};
代码:https://godbolt.org/z/rn48PTe1Y
哪个是正确的? 如果 Clang 过于宽容是错误的,允许访问的最佳方式是什么(除了提供 public getter?)
注意:如果友元函数只是在class中声明并在外部实现,both Clang and GCC reject the code.
好像是 a known defect in clang, bug id #11515,2011 年就已经报告了,但显然还没有修复。
一个编译但不应该编译的更简单的示例(来自上面的错误报告):
class A {
int n;
friend struct B;
};
struct B {
friend int get(A &a) {
return a.n; // clang accepts, and should reject
}
};