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++。
关于c++ - lambda 的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47031244/