Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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中的if constexpr:不同的编译器行为_C++_Lambda_Language Lawyer_C++17_If Constexpr - Fatal编程技术网

C++ 递归泛型lambda中的if constexpr:不同的编译器行为

C++ 递归泛型lambda中的if constexpr:不同的编译器行为,c++,lambda,language-lawyer,c++17,if-constexpr,C++,Lambda,Language Lawyer,C++17,If Constexpr,以下代码(编译标志为-std=c++17-Wall-Wextra-Werror-pedantic errors): clang++编译错误消息: 错误:使用推断类型“auto”声明的变量“foo”不能出现在其自身的初始值设定项中 return foo(tail...); 在这种情况下,什么行为符合标准?从C++17开始,Clang有权拒绝这种行为 如果需要具有未减少占位符类型的实体类型 要确定表达式的类型,程序的格式不正确 解析递归调用需要foo类型(查找operator()等)。需要确定闭合

以下代码(编译标志为
-std=c++17-Wall-Wextra-Werror-pedantic errors
):

clang++编译错误消息:

错误:使用推断类型“auto”声明的变量“foo”不能出现在其自身的初始值设定项中

return foo(tail...);

在这种情况下,什么行为符合标准?

从C++17开始,Clang有权拒绝这种行为

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

解析递归调用需要
foo
类型(查找
operator()
等)。需要确定闭合类型。因为这里推导的是闭包类型。。。你看它去哪里了


GCC可能会证明绕过它并非总是不可能的,但一般来说,标准禁止它。

我不知道它如何编译,因为foo没有被捕获(也不能被捕获)在这个例子中,Tyker不需要捕获全局对象,如“代码> FoO < /Cord>”。2017篇论文提出了一个C++语法的更改,允许在lambda声明中引用一个自引用的名称。我没有把它带进来,因为你在张贴的问题中没有问它。@Constructor-还有。这是不同的事情,真的。非常感谢您的回答和推荐!事实上,这看起来像一个悲伤的故事。
return foo(tail...);