当前位置: 首页 > 知识库问答 >
问题:

如果在递归泛型lambda中使用constexr:不同的编译器行为

仉梓
2023-03-14

以下代码使用g 7.3.0成功编译,但使用clang 6.0.0编译失败(编译标志为:编译标志为:c 17-Wall-Wextra-Werror-pedantic errors):

auto foo = [](auto, auto... tail) {
    if constexpr (sizeof...(tail) > 0)
    {
        return foo(tail...);
    }
    else
    {
        return 42;
    }
};

int main()
{
}

clang编译错误消息:

错误:以推导类型“Auto”声明的变量“foo”不能出现在它自己的初始化程序中

return foo(tail...);

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

共有1个答案

黎鹤轩
2023-03-14

根据【dcl.spec.auto】/10,自C 17起,Clang有权拒绝此要求。

如果需要具有未减少占位符类型的实体的类型来确定表达式的类型,则程序格式错误。

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

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

 类似资料:
  • 问题内容: 如下所示的非常简单的Java代码具有奇怪的输出,但是C和C ++中的相同逻辑代码具有正确的输出。我尝试使用JDK 1.7和JDK 1.3(相对于JRE),奇怪的输出始终存在。 输出为1,应为8。相对的C / C ++代码如下: 添加测试Java代码: 问题答案: 为了给出一个完整的答案,我将以乐趣(3)的方式进行介绍。对于那些不感兴趣为什么它适用于C ++但不适用于Java的人,请忽略

  • 问题内容: 我有一个包含一些User对象的列表,我正在尝试对列表进行排序,但是只能使用方法引用来工作,对于lambda表达式,编译器会给出错误: 错误: 问题答案: 这是编译器的类型推断机制的一个弱点。为了推断ulambda的类型,需要建立lambda的目标类型。这是如下完成的。期待类型为的参数。在第一行中,需要返回。这意味着需要一个带参数的a 。因此,在第一行的中,必须为并且一切正常。 在第二行

  • 问题内容: 我知道过去有一些关于在Eclipse中编译但不能在命令行中编译的问题,但是我还无法找到解决问题的答案。 特别是,我认为我可以设置eclipse以使用我的系统编译器,但这仍然不能解决问题。 我目前正在检查以下内容:“首选项-> Java->已安装的JRE”。 它仅包含一个JRE,这是我的系统之一。 这是问题的细节 我有一个Java通用类,将Enum类型作为参数,如下所示: 我在类中的某个

  • 问题内容: 注意:这是从Comparable和Comparator合约衍生出来的,涉及null 该代码可以在Eclipse(20090920-1017)中编译并正常运行 但是它不能在上编译javac 1.6.0_17。这是错误消息: 有人可以解释为什么差异吗?这是一个错误吗?如果是这样,谁有错误? 问题答案: 这是一个已确认的错误:错误ID 6468354。这是相关的摘录: 此问题是由以下事实引起

  • 在处理一些旧代码时,我偶然发现了一个问题,用lambda表达式或方法引用替换了几个匿名类。这个问题有点难以用语言来解释,但我会尽我所能,下面我还添加了一个简短的例子,尽我所能来说明我的问题。 我的示例包括。。。 > 一个函数接口,GenericListener,它接受类型参数V并具有单个方法“GenericCallback(V GenericValue)”。 一个类,CallbackProduce

  • Groovy中的简单泛型类 Groovy版本: 这是我做的一个简单的测试用例,当一个更复杂的类不能编译时,错误是“不能将类型T的值赋给类型double[]的变量”。