我正在使用 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/