想象以下代碼:如何保持shared_ptr對象的成員在異步函數中使用?
void async(connection *, std::function<void(void)>);
void work()
{
auto o = std::make_shared<O>();
async(&o->member, [] { do_something_else(); });
}
async
將,例如,開始使用的o
member
將其作爲一個指針通過的螺紋。但是,當o
在async()
被調用後立即超出範圍,並且它將被刪除,成員也將被刪除。
如何正確和很好地解決這個問題(!)?
顯然one solution是通過o
到捕獲列表。即使不使用,捕獲也保證不被優化。
async(&o->member, [o] { do_something_else(); });
然而,最近的編譯器(鐺-5.0)包括-Wextra
集合中的-Wunused-lambda-capture
。這種情況下會產生未使用的lambda捕獲警告。
我在lamdba裏面加了(void) o;
,它使這個警告無聲無息。
async(&o->member, [o] {
(void) o;
do_something_else();
});
是否有更優雅的方式來解決這個問題的範圍?
(這個問題的起源是從using write_async
of boost::asio
派生)
是'member'靜態函數取'的std ::功能'?這是我能想到的唯一可能性,在這種情況下,「o」甚至不需要保持活力。 –
假設爲了簡單起見'member'是一個'int'。 –
那麼int *是一個可調用函數? –