我正在尝试使用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代码吗? 该错误的原因是什么?
答案 0 :(得分:5)
这是有效的C ++ 17代码吗?
是的,这是有效的。正好一个return语句将被丢弃,而另一个将保留。即使没有保留,C ++仍然允许您从函数中省略return语句。如果达到函数的右花括号,则会出现不确定的行为,但这仅在执行到该点时才有风险。
在您的情况下,执行无法达到这样的程度,因此无法进行UB。
此错误的原因是什么?
您使用了-Werror
,因此将编译器的误报警告变成了硬错误。一种解决方法是针对该特定功能禁用此警告。这纯粹是实现问题。