c++ - 编译器如何从该 lambda 表达式推导出返回类型?

标签 c++ templates lambda boost function-declaration

我正在使用 Boost 库用 C++ 创建一个 Web 套接字服务器。我的出发点是来自此 site 的 Boost 示例。 我对 on_run 方法中的这部分代码有疑问:

 ws_.set_option(websocket::stream_base::decorator(
            [](websocket::response_type& res)
            {
                res.set(http::field::server,
                    std::string(BOOST_BEAST_VERSION_STRING) +
                        " websocket-server-async");
            }));

可以看出,ws_.set_option 采用 websocket::stream_base::decorator 作为参数,该参数是由 lambda 表达式创建的,该表达式采用Decorator&&类型变量按照这个site作为参数.

当 lambda 表达式中没有 Trailing-return-type 或 return 语句时,lambda 表达式如何知道它应该返回一个 Decorator&&? 最后但同样重要的是,websocket::response_type &res 来自哪里? lambda 主体后面没有包含此参数的 ()

最佳答案

websocket::stream_base::decorator 是一个具有一个模板类型参数的模板函数。

template<class Decorator>
decorator( Decorator&& f );

在此通话中

ws_.set_option(websocket::stream_base::decorator(
        [](websocket::response_type& res)
        {
            res.set(http::field::server,
                std::string(BOOST_BEAST_VERSION_STRING) +
                    " websocket-server-async");
        }));

调用该函数接受 lambda 表达式

[](websocket::response_type& res)
        {
            res.set(http::field::server,
                std::string(BOOST_BEAST_VERSION_STRING) +
                    " websocket-server-async");
        }

作为其模板参数。默认情况下,lambda 表达式的返回类型为 void,因为 lambda 表达式中没有 return 语句。

How does the lambda expression know, it should return a Decorator&&

它是 lambda 表达式本身用作声明的函数模板形参Decorator&&的实参。

关于c++ - 编译器如何从该 lambda 表达式推导出返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70739127/

相关文章:

c# - 使用 LINQ 表达式获取多个嵌套字典除外

c++ - constexpr 中的 std::variant 修改

c++ - 如何通过参数包传递引用?

templates - 如何更改 Accounts-UI 模板?

c# - 使用表达式树创建完全动态的 where 子句并在 IQueryable 上执行

java - 比 Stream.peek() 更好的方法

c++ - 从 Visual Studio 2010 (C++) 的错误列表中删除重复项

c++ - 主线程等待 std::async 完成

javascript - 为什么 JQuery Growfield 插件为我的文本区域提供默认值 "111 111"?

c++ - Variadic 模板在目标文件中有重复的符号?