今天我找到了这段代码
#include <cstdio>
auto terminal = [](auto term)
{
return [=] (auto func)
{
return terminal(func(term));
};
};
令人惊讶的是,GCC accepts it。 Clang拒绝它,因为它在自己的初始化程序中使用terminal
并声明为auto
。
我期待clang给出的错误,但它实际上是不正确的吗?或者必须接受代码吗?
答案 0 :(得分:15)
我认为这会遇到§7.1.6.4[dcl.spec.auto] / p11:
如果需要具有未减少占位符类型的实体的类型 为了确定表达式的类型,程序是不正确的。
您需要terminal
的类型来确定terminal
中的 id-expression return terminal(func(term));
的类型(编辑,帽子提示@Richard Smith),但就表达方式而言,你无法推断出terminal
的类型。