2014-11-04 80 views
2

如果參數類型在Visual Studio(2012,2013,2013年11月CTP)中返回void,我發現std::packaged_task無法推送到std::vector。例如,在Visual Studio中的std :: packaged_task錯誤?

typedef std::packaged_task<void()> packaged_task; 

std::vector<packaged_task> tasks; 
packaged_task package; 
tasks.push_back(std::move(package)); 

錯誤消息是:

error C2182: '_Get_value' : illegal use of type 'void' 
error C2182: '_Val' : illegal use of type 'void' 
error C2182: '_Val' : illegal use of type 'void' 
error C2512: 'std::_Promise<int>' : no appropriate default constructor available 
error C2665: 'std::forward' : none of the 2 overloads could convert all the argument types 

我認爲這是錯誤,因爲此代碼段工作,如果

  1. 的返回類型不是void
  2. 它在XCode中編譯。

在Visual Studio中是否有解決方案或其他選項?我知道這種提升可以用來取代這個。

+0

解決方法:爲什麼不使用emplace_back – 2014-11-04 11:05:23

+0

我可以用簡單的'auto m = std :: move(package);'來重現此操作。我懷疑這是一個MSVC錯誤。 – Niall 2014-11-04 11:44:03

回答

4

我可以用簡單的auto m = std::move(package);來重現這一點。

int main() 
{ 
    typedef std::packaged_task<void()> packagedtask; 
    packagedtask p1; 
    packagedtask p2; 
    p2 = std::move(p1); // does not cause the error 
    auto p3 = std::move(p2); // causes the error 
} 

拖網通過代碼,packaged_task嵌入式typedef如下;

typedef typename _P_arg_type<_Ret>::type _Ptype; 
typedef _Promise<_Ptype> _MyPromiseType; 

_P_arg_type提供了一個非void類型時,返回類型是voidpackaged_task移動構造函數包含對內部_Promise的引用,如_Promise<_Ret>;

_MyPromise(_STD forward<_Promise<_Ret> >(_Other._MyPromise)) 

這便成爲_Promise<void>繼而產生,其產生可見的錯誤列表進一步無效的代碼。它可能應該是;

_MyPromise(_STD forward<_MyPromiseType >(_Other._MyPromise)) 
// possibly even using a move 

作爲移動賦值運算符。

作爲解決方法,請考慮添加某種「虛擬」或「不可用」返回類型;

struct unusable {}; 

或者只是簡單地按照您已經建議的int或提升。

+1

謝謝,介紹一個假人是個好主意。 – cbel 2014-11-05 03:05:28