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

时间:2018-05-03 13:31:53

标签: c++ lambda language-lawyer c++17 if-constexpr

以下代码compiles successfully with g++ 7.3.0 and fails to compile with clang++ 6.0.0(编译标志为-std=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 ++ 编译错误消息:

  

错误:变量' foo'声明为推断类型' auto'不能出现在自己的初始化器中

return foo(tail...);

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

1 个答案:

答案 0 :(得分:12)

根据[dcl.spec.auto]/10,从C ++ 17开始,Clang拒绝这一点是正确的。

  

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

解析递归调用需要foo的类型(查找operator()等)。需要确定闭合类型。由于在这里推断了闭包类型......你会看到它的位置。

海湾合作委员会可能会证明它并非总是无法绕过它,但总的来说,该标准禁止它。