2015-04-29 32 views
4

我用std::packaged_task做了一些測試,發現了這個問題。C++無法在std :: pair中將lambda轉換爲std :: packaged_task

std::packaged_task<int(void)> task([]() -> int { return 1; }); 
task(); 

編譯並調用task()調用lambda。然而,這並不編譯:

std::pair<int, std::packaged_task<int(void)>> pair(15, []() -> int { return 15; }); 
pair.second(); 

因爲

錯誤C2664: 'std::pair<int,std::packaged_task<int (void)>>::pair(const std::pair<int,std::packaged_task<int (void)>> &) ':無法從' main::<lambda_abbe6cccb9110894d95e872872ec1296>' 轉換參數2 'const std::packaged_task<int (void)> &'

然而,這編譯:

std::vector<std::packaged_task<int()>> v; 
v.emplace_back([](){ return 1; }) 

爲什麼我無法創建pair

回答

5

問題中的構造函數是一個顯式的構造函數。你需要明確地調用它這個編譯:

std::pair<int, std::packaged_task<int(void)>> 
    pair(15, std::packaged_task<int(void)>{ []() -> int { return 15; } }); 

或者,更好的是,使用std::make_pair

auto pair = 
    std::make_pair(15, std::packaged_task<int(void)>{ []() -> int { return 15; } }); 

vector作品的情況下,由於emplace_back轉發的參數給value_type的構造函數。如果您嘗試使用push_back則無效。

相關問題