2013-06-06 36 views
3
#include <iostream> 
#include <memory> 
#include <future> 

using namespace std; 

unique_ptr<int> uq(new int); 

void foo(unique_ptr<int> q) 
{} 

int main() 
{ 
    foo(move(uq)); 
    //^OK 

    async(foo, move(uq)); 
    //^Error: error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : 
    // cannot access private member declared in class 'std::unique_ptr<_Ty>' 
} 

爲什麼'異步'不能編譯?我使用Microsoft Visual Studio 2012(v4.5.50709)。std ::異步與std :: unique不編譯

+0

作爲獨立語句的'...'不是有效的C++,而且你缺少一些'#include'。 –

+0

@Lightness軌道競賽 我只是不想重複大家都知道的代碼。 – user2431141

+0

你對「每個人都知道」的想法是主觀的,可能包含錯誤。最好完全拋棄'...',並寫下正確的'#include's,以便我們可以看到_you_正確地知道它。畢竟,這就是你來到這裏的原因,對吧? –

回答

2

這應該按照標準和它的工作does work on gcc

它在VS上失敗的原因可能是因爲std::async被允許存儲其參數的內部副本,然後它將在以後傳遞給被調用的函數。

在這種情況下,這將需要上的unique_ptr移動:一個用來構建異步中間對象,然後第二個傳遞參數到foo時。其中一個可能會失敗。然而,該標準明確指出async的參數只能是MoveConstructible(第30.6.8.2節),即unique_ptr

所以我想說這是VS2012實現標準庫時的一個bug。

+0

我什至不能編譯它在gcc 4.7.2。 – user2431141

相關問題