我有以下三段代碼來演示一個容易重現的問題。Clang only:一對<path, path>可以放入一個向量;所以可以配對<unique_ptr,unique_ptr>;但不是對<path,unique_ptr>:爲什麼?
using namespace boost::filesystem;
using namespace std;
int main()
{
path dummy_path;
// Snippet 1
// Two paths
// Succeeds
//
// vector<pair<path, path>> myvec;
// myvec.emplace_back(dummy_path, dummy_path);
// Snippet 2
// Two unique_ptr's
// Succeeds
//
// vector<pair<unique_ptr<int>, unique_ptr<int>>> myvec;
// myvec.emplace_back(unique_ptr<int>(new int(13)), unique_ptr<int>(new int(12)));
// Snippet 3
// A path and a unique_ptr.
//
// **FAILS** on Clang, succeeds in Visual Studio
//
vector<pair<path, unique_ptr<int>>> myvec;
myvec.emplace_back(dummy_path, unique_ptr<int>(new int(12)));
}
這裏是關於鏘編譯錯誤:
error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<int, std::__1::default_delete<int> >'
(在參考了對所述第二構件,所述unique_ptr
,很明顯)。
看來由於某種原因,失敗的情況下指出造成該對的複製構造函數,而不是移動構造函數被調用。
這是OS X 10.8.5上的Clang 5.0.2。 (和Windows 7 64位上的VS 11.0.60610.01 Update 3)。
在我的實際應用中,數據類型比較複雜,但是錯誤歸結爲這個問題中描述的錯誤。
我的問題是雙重的:爲什麼Clang上的案例顯示失敗,即使其他兩種涵蓋兩種數據類型的情況都成功了?
但也許更重要的是:我能做些什麼來解決這個問題?因爲我的實際應用程序更復雜,所以我沒有選擇不將給定對的emplace(或其他類似對象)放入向量中 - 但是如果有任何其他方法,我可以通過此Clang問題來獲得該對進入那個矢量,我會非常高興。
是否'myvec.emplace_back(STD ::移動(dummy_path)的unique_ptr(新INT(12)));'工作? –
jrok
@jrok - 我試過(並且會包含在問題中,但希望儘可能簡化問題)。答案是否定的。否。在'path','unique_ptr'或這兩者中添加'std :: move()'都會失敗。 –
來自[Coliru]的Clang版本(http://coliru.stacked-crooked.com/a/5e9f8c7e26df3674)編譯得很好。 – jrok