当在函数F
中声明lambda函数时,它是类C
的朋友,lambda函数是否可以访问C
个私有成员?具体来说,标准是否允许它?
答案 0 :(得分:16)
C ++11§[expr.prim.lambda] 5.1.2 / 3:
lambda-expression 的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型 - 称为闭包类型 - 其属性如下所述。此类类型不是聚合(8.5.1)。闭包类型在包含相应 lambda-expression 的最小块作用域,类作用域或命名空间作用域中声明。 ...
由于闭包类型是在friend函数中声明的,因此每个§[class.local]具有相同的访问权限9.8 / 1:
可以在函数定义中声明类;这样的类称为 local 类。本地类的名称是其封闭范围的本地名称。本地类位于封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。 ...
答案 1 :(得分:12)
嵌套类自动可以访问其所有成员"所有者"有权访问。你不需要lambdas来看这个:
class A {
friend struct B;
friend void g();
static void f() { }
};
struct B {
struct C {
static void f() { A::f(); }
};
static void f() { C::f(); }
};
void g() {
struct D {
static void f() { A::f(); }
};
D::f();
}
尽管未明确列为好友,但C::f
和D::f
可以在没有编译器投诉的情况下调用私有A::f
。
使用编译器生成的本地类(不仅仅是实现细节,标准要求的内容)来实现Lambda,因此适用与其他本地类相同的规则。
本地类可以访问相同成员的规则在9.8标准中列出:
本地类位于封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。