Alias for a lambda
Alias for a lambda
ISO C++常见问题解答(https://isocpp.org/wiki/faq/cpp11-language-templates,"模板别名")引用以下示例:
using P = [](double)->void; // using plus suffix return type
尝试使用 g++ -std=c++11 编译它时出现错误:
error: expected type-specifier before ‘[’ token
正确的语法应该是什么?如果我这样做
auto p = [](double)->void {};
p被推导出为<lambda(double)>
或main()::<lambda(double)>
,这取决于范围。但是,我不能这样做
using P = <lambda(double)>;
因为这也给出了一个错误:
expected type-specifier before ‘<’ token
它已被修复!更新后的条目如下:
using P = auto (*)(double)->void;
根据 [expr.prim.lambda],lambda 表达式为:
lambda-expression: lambda-introducer lambda-declarator[opt] compound-statement lambda-introducer < template-parameter-list > lambda-declarator[opt] compound-statement
复合语句不是可选的,因此[](double)->void
不是有效的 lambda 表达式。
[](double)->void {}
不是一种类型,decltype([](double)->void {})
格式不正确。没有简单的方法可以直接获取 lambda 的类型。您始终可以使用诸如
auto p = [](double) -> void {};
using P = decltype(p);
但我建议只坚持使用函数指针或std::function
,具体取决于您的用例,因为每个 lambda 都有不同的类型。
<lambda(double)>
既不是类型,也不是对象。这只是编译器引用特定lambda的一种方式,它C++无效。
相关文章:
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 在Linux for Windows上编译C++代码时出错
- 调用专用模板时出错"no matching function for call to [...]"
- 可组合的lambda/std::函数与std::可选
- 为什么我的for循环不能正确获取argv
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在基于范围的for循环中使用结构化绑定声明
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 我可以使用 lambda 来简化 for 循环吗?
- lambda deleter for Unique_ptr导致编译错误与函数
- 在 for 循环中使用 lambda 函数连接信号插槽
- Alias for a lambda
- C++ Lambda:访问 lambda 中的静态方法会导致错误'this was not captured for this lambda function'
- 将函数应用于std::map值,其中包含for each和lambda函数
- lambda中for循环的问题