23

考虑以下代码:

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

4

1 回答 1

28

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

于 2012-10-04T16:04:35.373 回答