C++:您能否执行 lambda 隐式复制捕获和显式复制捕获
C++: Can you do a lambda implicit copy capture plus explicit copy capture?
试图让一个对象保持活动状态(但不需要引用shared_ptr来这样做)我发现自己写了这样的东西:
void ClassDerivedFromSharedFromThis::countdown(ThreadPool &pool, std::string name){
auto self = shared_from_this();
pool.then([=, self]{
for(int i = 0;i < 10;++i){
atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "n";
}
});
}
但是后来在视觉工作室中出现一个错误,说我无法显式复制捕获,因为我已经在隐式复制捕获......这迫使我写:
void countdown(ThreadPool &pool, std::string name){
auto self = shared_from_this();
pool.then([=]{
self; //Capture self.
for(int i = 0;i < 10;++i){
atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "n";
}
});
}
我知道这行得通,但感觉不对。由于我只需要shared_ptr所有权的副作用,不需要直接引用它,因此我想在捕获列表中而不是 lambda 正文中表达这一点。
在我的真实代码中,我想在网络代码中的几个嵌套 lambda 中捕获大约 5 或 6 个变量,隐式捕获更好、更容易编辑。
我的问题是:这是标准行为还是Visual Studio 2015自己对lambda捕获限制的看法?较新版本的标准是否允许这样做,或者有人谈论过它?
是的,这是标准行为。 从 C++14 (N4140) [expr.prim.lambda]/8
如果 lambda 捕获包含
=
的捕获默认值,则该 lambda 捕获的每个简单捕获应采用"&标识符"的形式。
因此,如果您有[=]
那么您必须通过引用完成的任何其他捕获,例如
[=, &some_var]{} // copy all implicitly but explicitly capture some_var by reference
规则确实在 C++17 中发生了变化,但它是允许的
[=, *this]{};
这会将对象的副本捕获到 lambda 中。
你可以用初始化捕获做你想做的事:
void ClassDerivedFromSharedFromThis::countdown(ThreadPool &pool, std::string name){
pool.then([=, self=shared_from_this()]{
for(int i = 0;i < 10;++i){
atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "n";
}
});
}
奖金是您不必单独申报self
。
相关文章:
- 使lambda不可复制/不可移动
- 在 lambda 中锁定 std::shared_ptr 的复制操作
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 如何确定捕获不可复制参数的 lambda 的类型?
- 复制分配C++相同类型的 lambda
- 为什么在直接初始化和赋值中传递 lambda 而不是在复制初始化中传递 lambda 时会编译?
- lambda[=] 上的复制值被另一个封装的 lambda[&] 阻止
- 是否可以避免将参数复制到 lambda 函数?
- 我的lambda在复制构建期间没有正确转换捕获的"this"
- 复制 std::vector,但将 lambda 应用于每个元素
- 可以使用默认参数复制包含 lambda 的 std::函数吗?
- 为什么通过复制捕获 lambda 具有与外部变量相同的地址
- 是否可以传递具有捕获的不可复制(移动)值的 lambda
- 未定义 Lambda 复制分配运算符
- C++不可复制的 lambda 的行为是可复制的
- 为什么我无法更改 lambda 函数中复制捕获的变量的值?
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- C++:如何从 lambda 中"un-capture"不可复制的内容(例如 unique_ptr)?
- 不可变的 lambda 函数:复制捕获的变量是否允许是 const
- 在这种情况下,是否可以避免复制lambda函子