使用 Visual Studio 2013 RC 和 C++,我试图将一个传递std::unique_ptr
给已使用std::bind
. 但是,我遇到了麻烦,因为当我尝试这个时,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;
}
这可以在 GCC 4.8.1 中编译,但不能在 VS2013 RC 中编译。我一直在 VS 中遇到移动语义问题,但我真的很想使用std::unique_ptr
而不是std::shared_ptr
或原始指针。
我发现的一种解决方法是将函数签名更改为接受std::unique_ptr&
,它确实在 VS 和 GCC 中编译,但并没有使func
获取所有权的意图std::unique_ptr
特别清楚,并且还阻止我安全地异步调用该函数,除非我做了一些特别丑陋的事情:
#include <memory>
#include <iostream>
#include <functional>
#include <future>
#include <string>
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));
std::promise<void> prom;
std::async(
[&bound, &ptr, &prom]
{
std::unique_ptr<int> movedPtr = std::move(ptr);
prom.set_value();
bound(std::move(movedPtr));
});
prom.get_future().wait();
// Wait here
std::string dummy;
std::cin >> dummy;
}
有没有办法在不改变func
签名的情况下解决这个问题?
谢谢!