编译器如何从这个 lambda 表达式中推断出 return 类型?

How does compiler deduce return type from this lambda expression?

我正在使用 Boost 库在 C++ 中创建一个网络套接字服务器。我的起点是 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表达式创建的,lambda表达式接受一个Decorator&&类型的变量作为参数,根据这个site.

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

websocket::stream_base::decorator(...调用decorator的构造函数。这个构造函数显然需要一个可调用参数。传递的lamdba没有return。它的 return 类型是 void.

看这里(link 一些程序员评论):https://www.boost.org/doc/libs/1_78_0/libs/beast/doc/html/beast/ref/boost__beast__websocket__stream_base__decorator/decorator/overload2.html.

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 表达式默认具有 return 类型 void 因为在 lambda 表达式中没有 return 语句。

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

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