2015-10-06 27 views
1

我編譯包含在Visual Studio的2015年社區異步不會調用移動構造函數在Visual Studio 2015年

auto f = async(launch::async,     
      &WorkerThread<Hash>::run,     
      WorkerThread<Hash>(mInputFile, mOutputFile), 
      i, numthreads, mBlockSize);     
futures.push_back(std::move(f));  

好了,類似的問題已經被問這裏數十次,但通常下面的代碼中的問題問題在於某處不存在std::move

模板類WorkerThread<Hash>不可複製(已刪除複製構造函數和複製賦值運算符),但是可移動的。上面的代碼產生C2280: "WorkerThread<Hash>::WorkerThread(const WorkerThread<Hash> &)": attempted to reference deleted function(這是我的翻譯)。

它似乎沒有生成移動構造函數默認情況下,這將罰款在我的情況。當我明確地將它們設置爲default時,我得到相同的錯誤,但現在它指的是std::_Binder<std::_Unforced,_Ty,WorkerThread<Hash>,unsigned int,unsigned int,__int64>::_Binder(const std::_Binder<std::_Unforced,_Ty,WorkerThread<Hash>,unsigned int,unsigned int,__int64> &)

任何想法都非常受歡迎。

更新:MCVE

如果有可用的提到的編譯器,請嘗試進行編譯,並報告結果。我認爲這可能是我的一個安裝問題。

#include<future> 
#include<memory> 


class Foo { 
public: 
    Foo() :mData(new int[100]) {} 
    void run() {} 
private: 
    std::unique_ptr<int[]> mData; 
}; 


int main() 
{ 
    auto f = std::async(std::launch::async, &Foo::run, Foo()); 
    f.get(); 
} 
+0

你沒有發佈所有的錯誤,但我的猜測是,也許你應該使用futures.emplace_back(std :: move(f));而不是push_back? – Jonathan

+0

@Jonathan,不,結果相同 – vehsakul

+0

@ T.C。,Done。此代碼不適合我編譯。 – vehsakul

回答

4

編輯:該缺陷已被固定在MSVC 2015更新2

這是一個MSVC bug(用於找到報告帽尖@bogdan)。它的async(和packaged_task,看起來)實現將仿函數存儲在std::function中,該函數不支持移動類型,因此不能用於符合實現的實現。

一個簡單的解決方法是使用一個shared_ptr代替:

auto f = async(launch::async,     
      &WorkerThread<Hash>::run,     
      std::make_shared<WorkerThread<Hash>>(mInputFile, mOutputFile), 
      i, numthreads, mBlockSize);     
futures.push_back(std::move(f)); 

lambda表達式(沿[=]{WorkerThread<Hash>(mInputFile, mOutputFile).run(i, numthreads, mBlockSize); }的線)也可以考慮,但在行爲上的變化的結果:WorkerThread<Hash>不再中構建的該線程調用async,但在線程async產卵。

+0

看看你是否可以找到一個關於'std :: async'主題的Herb Sutter的視頻。由於一些設計缺陷,IIRC不是它的狂熱粉絲。 – marko