Alias for a lambda

Alias for a lambda

本文关键字:lambda for Alias      更新时间:2023-10-16

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++无效。