【问题标题】:Calling function in capture list of a lambda function在 lambda 函数的捕获列表中调用函数
【发布时间】:2016-12-06 01:53:04
【问题描述】:

在这个提升 asio example 我明白了:

auto self(shared_from_this()); //boost::shared_ptr<connection>

boost::asio::async_write(socket_, reply_.to_buffers(),
    [this, self](boost::system::error_code ec, std::size_t)
    {
        //...
    }
);

在 Visual Studio 2015 中,如果我写

[this, shared_from_this()](boost::system::error_code ec, std::size_t)

我收到以下错误:

错误 C2059 语法错误:')'

为什么 lambda 函数不能直接从对 shared_from_this() 的调用中捕获 boost::shared_ptr 变量?不是一样的吗?我在任何地方都找不到解释。我读过其他例子(例如thisthis,但他们不会问这个问题)。

【问题讨论】:

  • 尝试对命名捕获使用正确的语法:[this, self=shared_from_this()]( ... )
  • 这实际上编译成功,但对我来说仍然没有意义。在您的示例中,self 未声明(如示例 auto self(shared_from_this())),那么 lambda 是如何知道其类型的?
  • lambda 使用类型 auto 进行命名捕获,与您在显式声明中使用的类型相同。命名类型使用auto,编译器从用于初始化它的表达式中找出类型。
  • 好的,您可以将其添加为 aswer,以便我投票。

标签: c++


【解决方案1】:

在您的情况下,命名捕获的正确语法是:

[this, self=shared_from_this()]( ... ) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 2012-11-07
    • 2021-03-28
    • 2011-12-15
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多