Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost echo服务器示例并从lambda中的_this()捕获此和共享的__C++_Boost_Lambda_Boost Asio - Fatal编程技术网

C++ Boost echo服务器示例并从lambda中的_this()捕获此和共享的_

C++ Boost echo服务器示例并从lambda中的_this()捕获此和共享的_,c++,boost,lambda,boost-asio,C++,Boost,Lambda,Boost Asio,在boost示例中,有一个服务器类在新连接上创建会话: acceptor.async_accept(socket, [this](boost::system::error_code ec) { if (!ec) std::make_shared<session>(std::move(socket))->start(); do_accept(); }); session::do_read方法是一个私有成员函数: void do_read() {

在boost示例中,有一个服务器类在新连接上创建会话:

acceptor.async_accept(socket, [this](boost::system::error_code ec) {
    if (!ec)
        std::make_shared<session>(std::move(socket))->start();
    do_accept();
});
session::do_read
方法是一个私有成员函数:

void do_read()
{
    auto self(shared_from_this());
    socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
        [this, self](boost::system::error_code ec, std::size_t length) {
            if (!ec)
                do_write(length);
    });
}
如果我错了,请纠正我。
会话类继承自
std::enable\u shared\u from\u this
,因此在调用
shared\u from\u this()
时已经创建了一个控制块,并且不会发生未定义的行为。在
do\u read
函数
shared\u from\u中,此函数用于允许对仍然存在于内存中的对象调用
do\u write()
方法。如果不使用
shared\u from\u this()
,则在到达作用域末尾时可以删除该对象

为什么
这个
被捕获到lambda表达式中?
this
self
上是否调用了
do\u write()
方法

在C++14中,我可以替换:

auto self(shared_from_this());
socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
    [this, self] ...
与:

socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
        [this, shared_from_this()] ...
?? 即便如此:

socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
    [self = shared_from_this()](boost::system::error_code ec, std::size_t length) {
        if (!ec)
            self->do_write(length);
});  

self
对象作为所有权令牌捕获到lambda中:只要lambda存在,令牌就存在,并且对象不会被销毁

捕获
这个
在这里是多余的,但是如果没有它,人们将不得不编写

if (!ec)
    self->do_write(length);
而不是

if (!ec)
    do_write(length);
这和

if (!ec)
    this->do_write(length);
因此,
捕获此
主要是为了可读性

if (!ec)
    this->do_write(length);