C++ lambda friendship
C++ lambda friendship
当lambda函数在函数F
中声明时,该函数是类C
的友元,该函数是否有权访问C
的私有成员?具体来说,标准允许吗?
c++ 11§[expr.prim.]λ]5.1.2/3:
lambda表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型——称为闭包类型——其属性将在下面描述。这个类类型不是聚合(8.5.1)。闭包类型在包含相应lambda表达式. ... 的最小块作用域、类作用域或命名空间作用域中声明。
因为闭包类型是在友元函数中声明的,所以每个§[类都有相同的访问权限。本地)9.8/1:
类可以在函数定义中声明;这样的类称为本地类。局部类的名称对于其封闭作用域是局部的。局部类位于封闭作用域的作用域中,并且与封闭函数. ...
具有对函数外部名称的相同访问权限。
嵌套类可以自动访问它的"所有者"可以访问的所有成员。你不需要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
而不会引起编译器的任何抱怨。
Lambdas是使用编译器生成的局部类实现的(这不仅仅是一个实现细节,这是标准所要求的),因此适用与其他局部类相同的规则。
局部类可以访问相同成员的规则在标准9.8中有详细说明:
局部类位于封闭作用域的作用域中,并且对函数外部的名称具有与封闭函数相同的访问权限。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 这 4 个 lambda 表达式之间有什么区别?
- 在实现文件中使用头文件的通用 lambda
- C++ lambda friendship