考虑以下代码:
#include <iostream>
struct test
{
void public_test()
{
[this]() { private_test(); }();
}
private:
void private_test()
{
std::cout << "test\n";
}
};
int main()
{
test().public_test();
}
lambda 捕获它,然后调用捕获对象的私有方法。现在这段代码使用 VC++ 2012 编译和工作(打印test
)。虽然这是非常直观和有用的行为,但我想知道这是否可以保证按标准工作。因此,lambda 是否可以私有访问通过 捕获的任何对象this
?
我试图通过5.1.2 [expr.prim.lambda]在标准阅读中查找这一点,但无法真正找到明确的答案(对标准的深入了解并不那么精通)。唯一对我有用的段落是
lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型——称为闭包类型——其属性如下所述。此类类型不是聚合 (8.5.1)。闭包类型在包含相应 lambda 表达式的最小块作用域、类作用域或命名空间作用域中声明。[注意:这决定了与闭包类型(3.4.2)关联的命名空间和类的集合。lambda-declarator 的参数类型不会影响这些关联的命名空间和类。——尾注]
但另一方面,在成员函数中定义的普通本地类类型没有对周围类的私有访问权限。因此,具有私有访问权限的 lambda 会以某种方式将 lambdas 提升到本地函数对象的语法糖之上,以涉及更多的事情,因为它需要额外的“编译器魔法”才能以某种方式使其成为周围类的朋友。
那么 lambda 是否可以私有访问通过捕获的任何对象this
,如果是,标准的哪些部分允许这种情况发生?