【发布时间】:2020-12-04 11:02:15
【问题描述】:
我是 C++ 的新手,目前正在为我的第一个项目编写一个控制反转容器,通过在基类上添加注册并将其他参数转发给构造函数来扩展 this blog post。
它现在工作得很好,但是当我多次实例化一个 lambda 时,捕获的值似乎被覆盖了。
例子:
struct A{
short a;
explicit A(short a_) : a(a_) {}
};
struct IC{
virtual unsigned C() = 0;
};
struct CImpl : public IC{
explicit CImpl(unsigned c_) : IC(), c(c_) {}
unsigned C() override{return c;}
private:
unsigned c;
};
template<class T, typename...TArgs>
std::function<T*()> AsMinimalAsItGets(TArgs&&...args)
{
return [&args...]() mutable -> T*
{
return new T(std::forward<TArgs>(args)...);
};
}
auto aFactory = AsMinimalAsItGets<A>(3);
auto cFactory = AsMinimalAsItGets<CImpl>(5);
auto aInst = aFactory();//aInst->a should be 3 but is 5
auto cInst = cFactory();//cInst->C() is 5
A 被实例化为 5 而不是 3。
我尝试this 作为解决方案,但没有解决问题。
那么在实例化 lambda 时如何正确捕获变量? 我需要以一种使我能够在 lambda 中使用完美转发的方式进行捕获
【问题讨论】:
-
&args成为对时间的参考../ 同时更改为新值
标签: c++ lambda c++17 variadic-templates