在lambda设置中访问两步声明的成员
Access two-step-declared member in lambda setup
不知道该怎么形容才更好。下面是代码。这无法在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};
从翻译中可以看出,它使用了类成员,而不是类本身中的对象。
相关文章:
- 在声明中合并两个常量"std::set"(不是在运行时)
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 按 Tab 单步执行两个控制组
- 为什么系统日志有两个不同的函数声明?
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 类型测试对象的动态数组的这两个声明之间的区别?
- 一条线和两行声明之间的差异
- C++地图,这两个声明如何不正确
- 如何避免两步初始化
- 重新编译仅更改文件(两步)
- 在标准(C++14)中,哪里说以下两个声明是等价的
- 两步到一步的初始化和错误处理
- 两次声明纯虚拟函数(在层次结构中的两个类中)是否完全合法
- 这两个声明有什么区别?
- 比较两种声明数组的方法
- 在c++ 11中使用auto和两个声明会发生什么?
- 在lambda设置中访问两步声明的成员
- 在处理模板时,如何避免在函数头和函数体中两次声明相同的类型
- 两种声明模板友类的方法
- 两步摧毁物体背后的原因是什么