C++ &引用;“自动”;lambda中使用的变量在其自身的初始值设定项中
今天我找到了这个代码C++ &引用;“自动”;lambda中使用的变量在其自身的初始值设定项中,c++,lambda,auto,c++14,C++,Lambda,Auto,C++14,今天我找到了这个代码 #include <cstdio> auto terminal = [](auto term) { return [=] (auto func) { return terminal(func(term)); }; }; #包括
#include <cstdio>
auto terminal = [](auto term)
{
return [=] (auto func)
{
return terminal(func(term));
};
};
#包括
自动终端=[](自动术语)
{
返回[=](自动功能)
{
返回终端(func(术语));
};
};
令人惊讶的是。Clang拒绝它,因为它在自己的初始化器中使用终端
,并声明为自动
我原以为clang会犯错误,但它真的格式不正确吗?还是必须接受代码?我认为这符合§7.1.6.4[dcl.spec.auto]/p11:
如果需要具有未减少占位符类型的实体类型
要确定表达式的类型,程序的格式不正确
您需要
终端的类型来确定返回终端(func(term))中id表达式终端的类型
(编辑,hat tip@Richard Smith),但是在这个表达式中,您还不能推断出终端的类型。这似乎是利用了多态lambda,这是C++14中的一个特性。检查您的gcc版本和/或Clang版本是否支持多态lambdas。@YoungJohn,如果gcc版本编译代码,它显然支持多态lambdas。我可以自信地说,Coliru上的Clang版本既支持多态lambda,也不编译代码。@YoungJohn感谢您的建议。我检查了GCC,它支持多态lambda(因为它接受并执行我的代码片段)。Clang.所以GCC似乎只是在我将函数更改为实际调用声明语句和返回语句中的lambda时才会抱怨(并在main
中注释掉调用,因为此时它不再兼容)。实际上,apply运算符的返回类型是依赖的,必须仅在实例化时确定。您需要终端的类型来确定id表达式终端的类型,因此程序格式不正确。谢谢。总而言之:规范目前还不清楚在定义成员模板操作符()
时是否必须拒绝终端对自动变量的引用,或者在其实例化时是否必须接受该变量(此时变量不再是自动的
)。根据@RichardSmith对std讨论的回复,这种情况是由处理的,这使得这个案例的形式不正确