编译器如何从这个 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&&
。
我正在使用 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&&
。