获取此权限的lambda的访问权限

时间:2012-10-04 16:00:41

标签: c++ lambda c++11

请考虑以下代码:

#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捕获的任何对象,如果是,标准的哪些部分允许这种情况发生?

1 个答案:

答案 0 :(得分:28)

我不认为它是lambda的事实是相关的。所有的lambda都有 定义一个本地类。根据§11/ 2:“当地的一个类 成员函数可以访问与成员函数相同的名称 本身可以访问。“