"自动" lambda在其自己的初始化程序中使用的变量

时间:2014-09-05 20:39:02

标签: c++ lambda auto c++14

今天我找到了这段代码

#include <cstdio>

auto terminal = [](auto term)           
{                                       
    return [=] (auto func)             
    {                                   
        return terminal(func(term));
    };
};

令人惊讶的是,GCC accepts it。 Clang拒绝它,因为它在自己的初始化程序中使用terminal并声明为auto

我期待clang给出的错误,但它实际上是不正确的吗?或者必须接受代码吗?

1 个答案:

答案 0 :(得分:15)

认为这会遇到§7.1.6.4[dcl.spec.auto] / p11:

  

如果需要具有未减少占位符类型的实体的类型   为了确定表达式的类型,程序是不正确的。

您需要terminal的类型来确定terminal中的 id-expression return terminal(func(term));的类型(编辑,帽子提示@Richard Smith),但就表达方式而言,你无法推断出terminal的类型。