簡體   English   中英

這個 lambda 捕獲參數中的常量性在哪里引入?

[英]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); });

基於 BoostAsio 的現場演示


pmsg按值捕獲時,允許編譯器進行一次隱式轉換,因此從pmsg創建臨時shared_ptr實例並傳遞給handler ,但臨時對象不能綁定到左值引用(它可以與 const左值引用一起使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM