以下代码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...);
在这种情况下,符合标准的行为是什么?
答案 0 :(得分:12)
根据[dcl.spec.auto]/10,从C ++ 17开始,Clang拒绝这一点是正确的。
如果需要具有未减少占位符类型的实体的类型 为了确定表达式的类型,程序是不正确的。
解析递归调用需要foo
的类型(查找operator()
等)。需要确定闭合类型。由于在这里推断了闭包类型......你会看到它的位置。