在lambda设置中访问两步声明的成员

Access two-step-declared member in lambda setup

本文关键字:两步 声明 成员 设置 lambda 访问      更新时间:2023-10-16

不知道该怎么形容才更好。下面是代码。这无法在gcc 4.9.2 (Debian 8.5)上编译,但我认为它可以在以前的版本中编译。似乎只有当我在lambda设置中将后来声明的结构的成员作为默认参数访问时,才会出现这个问题。其他显示的案例也可以。

// Test program
class C1
{
private:
    // Forward-declared
    struct S_Private;
    S_Private* d_;
public:
    void func();
};
struct C1::S_Private
{
    int a;
};
void C1::func()
{
    // This will work
    int test = d_->a;
    // Accessing the d_->a as a default argument in lambda setup
    // will NOT work:
    // error: invalid use of non-static data member ‘C1::d_’
    auto some_lambda = [&](int arg = d_->a)
    {
        // This will also work
        int test2 = d_->a;
    };
}
int main(void)
{
}

不幸的是,在auto some_lambda = [&](int arg = d_->a)中,d_->a不是您之前在函数中使用的d_->a,而是在您使用[&]捕获的this上调用d_->a。因为它是成员变量,所以不能将其用作函数的默认实参。

基本上

auto some_lambda = [&](int arg = d_->a)
{
    // This will also work
    int test2 = d_->a;
};

struct some_unique_name
{
    some_unique_name(C1*& var) : this_(var) {}
    auto operator()(int arg = this_->d_->a)
    {
        // This will also work
        int test2 = d_->a;
    }
    C1*& this_;
};
auto some_lambda = some_unique_name{this};

从翻译中可以看出,它使用了类成员,而不是类本身中的对象。