请考虑以下代码:
#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表达式的类型(也是表达式的类型) closure object)是一个唯一的,未命名的nonunion类类型 - 称为 闭包类型 - 其属性如下所述。这个类类型 不是聚合(8.5.1)。闭包类型在。中声明 包含的最小块范围,类范围或命名空间范围 相应的lambda表达式。 [注意:这决定了集合 与闭包类型相关联的名称空间和类(3.4.2)。 lambda声明符的参数类型不会影响这些参数类型 关联的命名空间和类。 - 后注]
但另一方面,成员函数中定义的普通本地类类型没有对周围类的私有访问权限。因此,具有私有访问权限的lambda会以某种方式将lambdas提升为仅仅是语法糖的本地函数对象,因为它需要额外的“编译器魔术”以某种方式使其成为周围类的朋友。
lambda是否可以私有访问通过this
捕获的任何对象,如果是,标准的哪些部分允许这种情况发生?
答案 0 :(得分:28)
我不认为它是lambda的事实是相关的。所有的lambda都有 定义一个本地类。根据§11/ 2:“当地的一个类 成员函数可以访问与成员函数相同的名称 本身可以访问。“