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

Chr*_*ica 23 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();
}
Run Code Online (Sandbox Code Playgroud)

lambda捕获它,然后调用捕获对象的私有方法.现在这段代码test使用VC++ 2012 编译和工作(打印).虽然这是非常直观和有用的行为,但我想知道这是否可以保证按标准工作.因此,lambda是否可以私有访问通过this?捕获的任何对象?

我试着通过5.1.2 [expr.prim.lambda]的标准阅读来查看这个内容,但实际上找不到一个明确的答案(不是那么精通标准的深度).唯一对我有用的段落是

lambda-expression的类型(也是闭包对象的类型)是一个唯一的,未命名的nonunion类类型 - 称为闭包类型 - 其属性如下所述.此类类型不是聚合(8.5.1).闭包类型在包含相应lambda表达式的最小块作用域,类作用域或命名空间作用域中声明.[注意:这确定了与闭包类型相关联的名称空间和类的集合(3.4.2).lambda声明符的参数类型不会影响这些关联的命名空间和类. - 尾注]

但另一方面,成员函数中定义的普通本地类类型没有对周围类的私有访问权限.因此,具有私有访问权限的lambda会以某种方式将lambdas提升为仅仅是语法糖的本地函数对象更多涉及的东西,因为它需要额外的"编译器魔术"以某种方式使其成为周围类的朋友.

那么lambda是否可以私有访问通过的任何对象this,如果是,标准的哪些部分允许这种情况发生?

Jam*_*nze 28

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

  • @ChristianRau这是在C++ 11中改变(或至少澄清)的东西.(我认为它符合最初的意图,但是IIRC,C++ 03,或者至少是C++ 98,并没有说清楚,甚至可能说了些相反的话.) (3认同)