C ++ lambda友谊

时间:2014-05-23 17:06:07

标签: c++ c++11

当在函数F中声明lambda函数时,它是类C的朋友,lambda函数是否可以访问C个私有成员?具体来说,标准是否允许它?

2 个答案:

答案 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::fD::f可以在没有编译器投诉的情况下调用私有A::f

使用编译器生成的本地类(不仅仅是实现细节,标准要求的内容)来实现Lambda,因此适用与其他本地类相同的规则。

本地类可以访问相同成员的规则在9.8标准中列出:

  

本地类位于封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。