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...);