这个builds在GCC中,但不是MSVC。GCC似乎可以从嵌套类中的友元函数访问外部类的私有成员,但MSVC不能。这是为什么呢?
template <typename T>
class Outer
{
public:
struct Inner {
friend bool operator==(const Inner& a, const Inner& b) {
return a.outer_.private_member_ == b.outer_.private_member_;
}
// Both compilers are happy this if uncommented
// bool operator==(const Inner& other) {
// return outer_.private_member_ == other.outer_.private_member_;
// }
private:
Outer<T>& outer_;
};
friend struct Iterator;
private:
int private_member_;
};
bool test(Outer<int>::Inner A, Outer<int>::Inner B)
{
return A == B;
}
1条答案
按热度按时间qco9c6ql1#
该程序是病态,根据class.nest#4,它声明:
与成员函数一样,在嵌套类中定义的友元函数([class.friend])也在该类的词法作用域中;它遵循与该类的静态成员函数([class.static])相同的名称绑定规则,但是它对封闭类的成员没有特殊的访问权限。
(强调我的)
这意味着不允许示例中的重载
operator==
访问封闭类Outer<T>
的名为private_member_
的私有数据成员。要使其格式良好,可以将
operator==(const Inner&, const Inner&)
作为Outer<T>
的友元。Demo下面是gcc的bug:
GCC accepts private member access of enclosing class through friend function of inner class