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));