【发布时间】:2016-10-26 17:47:09
【问题描述】:
我正在尝试将本地 lambda 函数传递给 std::bind(用于传递信号的 connect 函数):
void f()
{
auto signal_f = [this](int, int) { /* ... */ };
namespace ph = std::placeholders;
signal.connect(std::bind(signal_f, ph::_1, ph::_2));
}
但是std::bind的函数参数是作为通用引用接收的:
template<class F, class... Args>
/* unspecified */ bind(F&& f, Args&&... args);
所以,由于我的 lambda 对象是一个命名对象,它作为左值引用传递,但我的 lambda 对象将在 f() 存在后被销毁,在发出信号时可能会导致内存泄漏。
通过副本传递该对象的最简单方法是什么?
当然,我总是可以这样做:
signal.connect(std::bind<std::decay<decltype(signal_f)>::type>
(signal_f, ph::_1, ph::_2));
还有其他一些棘手的方法,但它们太麻烦了,那么,最简单的方法是什么?
注意:标准库中是否有任何函数可以创建副本,例如 std::make_rvalue(o) 或 std::copy 用于对象而不是容器的版本?
【问题讨论】: