Visual Studio 2013 C++;-将std::unique_ptr传递给绑定函数 使用VisualStudio 2013 RC和C++,我试图将 STD::UnQuyGPPT转换为使用 STD::BooN/COD>绑定的函数。然而,我有麻烦,因为VS似乎不喜欢它,当我尝试这个。以下是我试图编译的内容: #include <memory> #include <iostream> #include <functional> void func(std::unique_ptr<int> arg) { std::cout << *arg << std::endl; } int main() { std::function<void (std::unique_ptr<int>)> bound = std::bind(&func, std::placeholders::_1); std::unique_ptr<int> ptr(new int(42)); bound(std::move(ptr)); return 0; }
有没有办法在不更改Visual Studio 2013 C++;-将std::unique_ptr传递给绑定函数 使用VisualStudio 2013 RC和C++,我试图将 STD::UnQuyGPPT转换为使用 STD::BooN/COD>绑定的函数。然而,我有麻烦,因为VS似乎不喜欢它,当我尝试这个。以下是我试图编译的内容: #include <memory> #include <iostream> #include <functional> void func(std::unique_ptr<int> arg) { std::cout << *arg << std::endl; } int main() { std::function<void (std::unique_ptr<int>)> bound = std::bind(&func, std::placeholders::_1); std::unique_ptr<int> ptr(new int(42)); bound(std::move(ptr)); return 0; },c++,visual-studio,c++11,visual-studio-2013,C++,Visual Studio,C++11,Visual Studio 2013,有没有办法在不更改func签名的情况下绕过此问题 谢谢 与std::bind绑定的函数不转发参数,而是将参数复制到函数中。因此,从c++11开始,std::bind不适用于仅移动类型。这个问题就是“更完美的转发”(more perfect forwarding)建议背后的想法。有一个较新的版本,但我现在似乎找不到。最近我在VS 2012上遇到了同样的问题。我相信这是MSVC中的一个bug;至少在MSVC++11中,伪变量展开似乎将参数按值转发给某些内部函数。这似乎没有得到改善。 作为一种解决方法
func
签名的情况下绕过此问题
谢谢 与
std::bind绑定的函数不转发参数,而是将参数复制到函数中。因此,从c++11开始,std::bind
不适用于仅移动类型。这个问题就是“更完美的转发”(more perfect forwarding)建议背后的想法。有一个较新的版本,但我现在似乎找不到。最近我在VS 2012上遇到了同样的问题。我相信这是MSVC中的一个bug;至少在MSVC++11中,伪变量展开似乎将参数按值转发给某些内部函数。这似乎没有得到改善。
作为一种解决方法,我改用lambdas,但需要另一种方法才能使其正常工作:
std::function<void (std::unique_ptr<int>)> bound =
[] (std::unique_ptr<int> arg) { func(std::move(arg)); };
std::函数绑定=
[](std::unique_ptr arg){func(std::move(arg));};
仍然没有编译。但如果添加任何捕获的值(即使是未使用的值),它将编译:
int x;
std::function<void (std::unique_ptr<int>)> bound =
[x] (std::unique_ptr<int> arg) { func(std::move(arg)); };
intx;
函数绑定=
[x] (std::unique_ptr arg){func(std::move(arg));};
您还必须将参数移动到func
的绑定调用中。不仅在调用bound
bound(std::move(ptr));
但在约束中:
std::function<void(std::unique_ptr<int>)> bound =
std::bind(func,
std::bind(std::move<std::unique_ptr<int>&>,
std::placeholders::_1));
std::函数绑定=
标准::绑定(函数,
标准::绑定(标准::移动,
std::占位符::1));
这是在VS2013(更新4)中为我编译的。您不能通过值传递unique_ptr,它没有复制构造函数。因此,std::move()
。如果我直接调用它,调用func(std::move(ptr))
效果很好,但在绑定时就不行了。那么为什么不将func
更改为接受unique\u ptr&&
而不是在VS2013中编译呢。。。在这种情况下,将参数设为std::unique\u ptr
与std::unique\u ptr&
没有任何实际区别。对于将参数绑定到std::function
中的函数来说,这可能是正确的,但我尝试使用的std::function
只有占位符。我的第一个代码段是用GCC编译的,但不是VS。我正试图找到一个解决方法,这样我就可以保留func
的签名,并且仍然用VS编译。啊,这正是我需要的!对于Linux目标,也应该很容易定义ifdef。非常感谢你!你刚刚帮我省去了一次重新设计的努力。谢谢我知道GCC4.7也能正确处理占位符。VS2013(VC12)中不再需要使用假捕获值的黑客攻击。
std::function<void(std::unique_ptr<int>)> bound =
std::bind(func,
std::bind(std::move<std::unique_ptr<int>&>,
std::placeholders::_1));