几个月前,我跟着上一个问题,我想问一个容器如何在内部处理Lampda表达式。
假设以下代码:
#include <iostream>
#include <type_traits>
#include <queue>
#include <functional>
std::queue<std::function<void()>> funcs;
class A
{
public:
A()
{
std::cout << "A constructor" << std::endl;
}
void foo(int a)
{
}
};
class ThePool
{
public:
template <typename _Callable, typename Object, typename... _Args>
void QueueFunction(_Callable __f, Object& obj, _Args... __args)
{
funcs.push([__f, &obj, &__args...]() mutable
{
(obj.*__f)(__args...);
});
}
};
int main(int argc, char** argv)
{
ThePool t;
A a;
int x = 5;
t.QueueFunction(&A::foo, a, x);
std::function<void()> func = funcs.back();
func();
return 0;
}
如果将A类和args的实例作为值传递,则很明显将复制这些值。如果将类A的实例作为引用,而将args用作引用,我会感到困惑。我知道在内部在容器中进行复制。从我的角度来看,函数指针的地址将被复制。是否也可以复制obj和args的实例?
举个例子,我注意到当我以A实例作为引用并最终为队列提取函数f并将其称为A的实例时,这并不相同。