1

我遇到的問題與MSVC右值引用2012年參數(的Visual C++ 2012)

#include <thread> 
#include <string> 
#include <future> 

void foo(std::promise<std::string> &&prms) { /* some code */ } 

int main() { 
    std::promise<std::string> prms; 
    // std::future<std::string> ftr = prms.get_future(); 
    std::thread th(&foo, std::move(prms)); 

    // some other code 
} 

編譯器說:錯誤C2664:「無效(STD ::承諾< _Ty > & &)」:不能從轉換參數1 '的std ::承諾< _Ty>' 到 '的std ::承諾< _Ty> & &'

有沒有我的錯誤(當時如何解決它)或編譯器問題(然後我我想知道這種行爲的起源)?

+0

@KerrekSB - 實際上,這是來自Bartocz Milewski的代碼示例。看看[他的帖子](http://bartoszmilewski.com/2009/03/03/broken-promises-c0x-futures/)(section * future *)。我想知道,爲什麼我不能編譯它。 – Loom

+0

我想知道爲什麼Bartocz正試圖移動這個承諾。 –

+0

@LightnessRacesinOrbit - 我可以猜測,這是一種擺脫範圍問題的方法。如果左值引用'promise',那麼這個問題是可能的。 – Loom

回答

3

這是在Visual C++ 2012實現std::thread中的已知問題。請參閱Microsoft Connect上的以下錯誤:

std::thread constructor doesn't handle movable object

到錯誤狀態的響應:

我們試圖VC11的發展過程中解決這個問題,但它可怕的爆炸,我們有恢復變化。事實證明,std :: thread不能由bind()驅動,因爲線程需要移動它的參數,並且bind()被禁止這樣做(因爲綁定的函數應該可以重複調用,而不必將它們的綁定參數移出) 。所以我們需要重新執行std::thread的ctor以避免使用bind()