我试图使用C++17 if 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代码吗?这个错误背后的原因是什么?
发布于 2019-11-03 11:53:23
这是有效的C++17代码吗?
是的,是有效的。只有一条返回语句将被丢弃,而另一条将保留。即使没有保留,C++仍然允许您从函数中省略返回语句。如果达到函数的闭包大括号,则会得到未定义的行为,但只有在执行达到此点时才会出现这种情况。
在您的情况下,执行不能达到这样的点,所以UB是不可能的。
这个错误背后的原因是什么?
您使用了-Werror,从而将编译器的错误正警告转换为一个严重错误。解决方法之一是在特定函数周围禁用此警告。这纯粹是一个执行质量问题。
https://stackoverflow.com/questions/58679786
复制相似问题