【问题标题】:C++ 11 lambda expression as template argumentC++ 11 lambda 表达式作为模板参数
【发布时间】:2016-07-11 15:58:21
【问题描述】:

我已经看到很多使用 lambda 表达式作为模板参数的示例,但是当我在 cppreference.com 阅读 lambda 函数的参考页面时, 它有这样一个简短的句子:

Lambda 表达式不允许出现在未计算的表达式、模板参数、别名声明、typedef 声明以及函数(或函数模板)声明中除函数体和函数的默认参数之外的任何地方。

我很困惑,这句话是错的还是我没有理解正确?

【问题讨论】:

    标签: c++11 lambda


    【解决方案1】:

    你可以做什么:

    template <class>
    struct Foo;
    
    auto l = []{};
    Foo<decltype(l)> f;
    

    你不能做什么:

    template <SomeType lambda>
    struct Foo;
    
    Foo<[]{}> f;
    

    换句话说,lambda 的类型和其他类型一样是普通类型,但 lambda 表达式本身不能用于特化模板。这同样适用于未评估的上下文,例如 decltypesizeof 的操作数。

    【讨论】:

    • 我犯了一个错误,我的意思是使用 lambda 表达式作为函数模板参数。这样的用例在现实世界的 c++ 程序中非常常见。然后模板推导会推导出传入的lambda函数的闭包类型的模板参数。
    • @sniel 哦,那将是函数模板的参数。它们没有问题,“模板参数”专门指尖括号内的那种类型:)
    猜你喜欢
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多