C++ 可以优化lambda按值捕获吗?

C++ 可以优化lambda按值捕获吗?,c++,boost,lambda,boost-asio,lifetime,C++,Boost,Lambda,Boost Asio,Lifetime,我目前正在为一个项目使用boost::asio,并且必须向远程端点发送缓冲区。我当前发送数据的算法如下所示: void send_the_data(DataElement const& data) { auto databuf = make_shared<std::vector<uint8_t>>(data.to_bytes()); // lambda object holds a reference to the data to prevent

我目前正在为一个项目使用boost::asio,并且必须向远程端点发送缓冲区。我当前发送数据的算法如下所示:

void send_the_data(DataElement const& data)
{
    auto databuf = make_shared<std::vector<uint8_t>>(data.to_bytes());

    // lambda object holds a reference to the data to prevent early destruction. 
    asio::async_write(this->sock,
        asio::buffer(databuf),
        transfer_all(),
        [this, databuf](size_t bt, boost::system::error_code const& ec)
    {
        if(ec) this->handle_error(ec);
        else this->do_the_next_thing();

        assert(bt = databuf->size());
        // the destructor of this lambda should clean up the data buffer here,
        // after it has been handled. 
    });

}
void发送数据(数据元素常量和数据)
{
auto-databuf=make_shared(data.to_bytes());
//lambda对象保存对数据的引用,以防止早期破坏。
asio::异步写入(此->sock,
asio::缓冲区(databuf),
传输_all(),
[this,databuf](大小,boost::系统::错误代码常量&ec)
{
如果(ec)此->处理错误(ec);
否则这->做下一件事();
断言(bt=databuf->size());
//这个lambda的析构函数应该清理这里的数据缓冲区,
//在它被处理之后。
});
}
我的逻辑是,共享ptr的lambda捕获将防止它被破坏,直到
async\u write
完成之后,然后在处理程序执行后正确清理缓冲区

然而,我很好奇,如果lambda的主体中没有引用变量,那么主要编译器或标准是否允许省略对变量的捕获,这将导致未定义的行为(由于可能访问
async\u write
调用中的悬挂指针),或者,如果标准保证所有价值捕获不会被忽略

虽然理论上允许编译器优化闭包类型,但这种优化只允许在“仿佛”规则下进行。因此,编译器可以优化闭包类型中未引用的数据,但它仍然必须产生与相应成员的构造/销毁相关的任何副作用


指定为每个显式捕获创建闭包类型的成员。指定如何初始化它。基于此,我要说的是,编译器不允许优化您的
共享\u ptr

,如果您显式捕获该变量,则它们不应该这样做。它可能包含另一个变量引用为Faik的内存,无法对其进行优化,因为“仿佛规则”(lambda捕获没有例外)。此处不能使用
unique_ptr
,因为在1.67之前的boost版本上,完成处理程序必须是可复制的()。(遗憾的是,我的linux发行版目前只提供1.58版。)好的,我将删除这一部分…