2017-07-06 458 views
0

我需要從代碼中的某個點開始處於活動狀態,直到某個任務開始執行。 就像例如:傳遞std :: shared_ptr作爲lambda捕獲列表(C++)的引用

shared_ptr<FromThisPointToTaskStart> ftptts = make_shared<FromThisPointToTaskStart>(); 
. . . 
runningTask.then([ftptts](task<void> task) 
{ 
    . . . 
    try{ 
     // Decrementing reference and deallocating object if ref count == 0; 
     ftptts = nullptr; 
     task.get(); 
    } 
} 
// decrementing reference count so that it lives untill task starts 
ftptts = nullptr; 

的問題是,捕獲列表捕獲這個恆定,我不能改變它。 什麼是正確的方式做我想要的?我應該像[& ftptts]那樣通過它嗎?

謝謝!

+4

製作的λ可變](http://en.cppreference.com/w/cpp/language/lambda)應該得到你正在尋找的行爲。 –

+0

如果我在捕獲列表中有多個參數會怎麼樣,我將如何使這一個變得可變而不是其他? –

+0

@ J.Doe這似乎有一些信息:https://stackoverflow.com/questions/3772867/lambda-capture-as-const-reference – Galik

回答

1

我已經測試你的代碼,這裏的發現:

  1. 傳遞的std :: shared_ptr的非基準會認爲你將不會改變該變量,但它的壽命將延長至年底.then {}塊甚至認爲您不在該塊中使用它,並將其設置爲外部作用域中的nullptr。

  2. 將std :: shared_ptr作爲參考傳遞時,會在您將其設置爲nullptr在周圍範圍內時解除分配對象,因此在將它設置爲nullptr後,您將會遇到異常。

  3. 您要求的解決方案是添加可變的,儘管這會使所有其他參數也是可變的。

    runningTask.then([ftptts](task<void> task) mutable{...} 
    
相關問題