使用Visual Studio 2013 RC和C++,我試圖將std::unique_ptr
傳遞給使用std::bind
綁定的函數。但是,我遇到了麻煩,因爲當我嘗試這個時,VS似乎並不喜歡它。這是我想要編譯的內容:Visual Studio 2013 C++ - 將std :: unique_ptr傳遞給綁定函數
#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
的簽名?
謝謝!
您無法通過值傳遞unique_ptr,它沒有複製構造函數。 – yngccc
因此'std :: move()'。調用'func(std :: move(ptr))'可以很好地工作,如果我直接調用它,而不是當它被綁定時。 – mgbowen
然後爲什麼不改變'func'接受'unique_ptr&&'而不是 –
yngccc