无法编译简单的C++17程序

Unable to compile a simple C++17 program

本文关键字:C++17 程序 简单 编译      更新时间:2023-10-16

我正在尝试使用C++17if constexpr功能,但未能编译一个简单的函数。

代码:

template <auto B>
int foo()
{
if constexpr(B)
{
return 1;
}
else
{
return 2;
}
}  // <- I get an error here 
int main()
{
return foo<false>();
}

编译器输出的错误:

<source>(12): error #1011: missing return statement at end of non-void function "foo<B>() [with B=false]"
}

使用了-std=c++17 -O3 -Wall -Werror编译器标志和icc 19.0.1编译器。

这是有效的C++17代码吗?这个错误背后的原因是什么?

这是有效的C++17代码吗?

是的,它是有效的。正好一个返回语句将被丢弃,而另一个将保留。即使没有剩余,C++仍然允许您从函数中省略return语句。如果达到函数的右大括号,则会得到未定义的行为,但只有当执行达到该点时,这才有风险。

在您的情况下,执行无法达到这样的点,因此UB是不可能的。

这个错误背后的原因是什么?

您使用了-Werror,从而将编译器的误报警告转化为硬错误。一种解决方法是禁用该特定功能的警告。这纯粹是一个实施质量问题。