Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;“自动”;lambda中使用的变量在其自身的初始值设定项中_C++_Lambda_Auto_C++14 - Fatal编程技术网

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讨论的回复,这种情况是由处理的,这使得这个案例的形式不正确