通过std :: bind传递rvalues
我想通过
std::bind
将rvalue传递给一个在C ++ 0x中采用右值引用的函数。我无法弄清楚该怎么做。例如:
#include <utility>
#include <functional>
template<class Type>
void foo(Type &&value)
{
Type new_object = std::forward<Type>(value); // move-construct if possible
}
class Movable
{
public:
Movable(Movable &&) = default;
Movable &operator=(Movable &&) = default;
};
int main()
{
auto f = std::bind(foo<Movable>, Movable());
f(); // error, but want the same effect as foo(Movable())
}
没有找到相关结果
已邀请:
5 个回复
纤洞需匪
时,你绑定的函数是:
但是,
传递的值不是rvalue,而是一个左值(在结果
仿函数中的某个位置存储)。那,生成的仿函数类似于:
构造为
。所以你可以看到这个失败,因为
不能绑定到
。† 一个简单的解决方案可能是这样:
因为现在你正在调用的函数是:
通话工作正常(当然,如果需要,你可以做到
)。但一个有趣的问题是,如果我们可以让你的原始绑定工作,我们可以通过:
也就是说,在我们进行调用之前,我们只是参数,因此它可以绑定。但是,哎呀,这很难看。强制转换是必需的,因为
是一个重载函数,因此我们必须通过强制转换为所需类型来指定我们想要的重载,从而消除其他选项。 如果
没有超载,它实际上不会那么糟糕,好像我们有类似的东西:
哪个更简单。但除非你有这样的功能,否则我认为很明显你可能只想指定一个更明确的模板参数。 †这与在没有显式模板参数的情况下调用函数不同,因为明确指定它会消除推导它的可能性。 (
,其中
是一个模板参数,可以推导出任何东西,如果你允许的话。)
眠缝
正如你从上面的概念证明中可以看到的,它很可能...... 我没有看到为什么std :: bind与std :: move不兼容... std :: forward毕竟是完美的转发我不明白为什么没有std :: forwarding_bind ???
悸翠疮武昏
僻朵庙惩竣
这似乎是最简单的选择。
珊畴炮贩号
(适用于gcc-4.9.2和msvc2013)