gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:19 25 4
gpt4 key购买 nike

不知道怎么形容比较好。这是代码。这无法在 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 您之前在函数中使用过,但 d_->a 是在您使用 [&] 捕获的 this 上调用的。因为它是一个成员变量,所以您不能将它用作函数中的默认参数。

本质上

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};

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

关于c++ - 在 lambda 设置中访问两步声明的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39418837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com