[英]where is the const-ness in this lambda capture argument introduced?
此代碼正確編譯。
#include <asio.hpp>
#include <memory>
#include <iostream>
struct Message { int msg; };
// never mind global variables, just for the sake of making this a minimal example
extern asio::ip::tcp::socket mysocket;
void handler(std::shared_ptr<Message> pmsg, asio::error_code error, size_t nbytes);
void readMessage()
{
std::shared_ptr<Message> pmsg{ new Message };
asio::async_read(mysocket, asio::buffer(&pmsg->msg, sizeof(int)),
[pmsg](auto err, auto nbytes) { handler(pmsg, err, nbytes); });
}
但是,當我添加對處理程序函數的第一個參數的引用時
void handler(std::shared_ptr<Message>& pmsg, asio::error_code error, size_t nbytes);
代碼不再編譯,抱怨我試圖將 pmsg 從const std::shared_ptr<Message>&
轉換為std::shared_ptr<Message>&
。
為了讓它再次工作,我必須在對處理程序的調用中引入一個const_cast<std::shared_ptr<Message>&>
。
const-ness 在哪里引入?
謝謝
psmg
是按值捕獲的,因此它只能在閉包內讀取。 如果您希望它是可修改的(因為handler
可以通過引用獲取shared_ptr
來做到這一點),您必須將mutable
添加到 lambda:
[pmsg](auto err, auto nbytes) mutable { handler(pmsg, err, nbytes); });
當pmsg
按值捕獲時,允許編譯器進行一次隱式轉換,因此從pmsg
創建臨時shared_ptr
實例並傳遞給handler
,但臨時對象不能綁定到左值引用(它可以與 const左值引用一起使用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.