c++ - lambda 的别名

标签 c++ c++11

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/

相关文章:

c++ - 使用 -std=c++0x 导致错误 : ‘Iterator’ does not name a type error

python - c++0x std::shared_ptr 与 boost::shared_ptr

c++ - ZeroMQ:重新绑定(bind)套接字时地址正在使用错误

c++ - 爬楼梯 DP 问题基本案例概念

c++ - 递归地使用单个函数显示具有最小值和最大值的三角形

c++ - 包含它的模板化类型的 shared_ptr

c++ - 在 C++ 中实现随机 oracle(输出在范围内是随机的,但相同输入的输出相同)

c++ - 有没有更好的方法来创建这个游戏循环? (C++/Windows )

c++ - 在 Ubuntu 11.10 上编译 C++ 和 OpenSSL

pointers - 从克隆方法返回托管指针