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

时间:2019-11-03 11:39:12

标签: c++ c++17

我正在尝试使用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代码吗? 该错误的原因是什么?

1 个答案:

答案 0 :(得分:5)

  

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

是的,这是有效的。正好一个return语句将被丢弃,而另一个将保留。即使没有保留,C ++仍然允许您从函数中省略return语句。如果达到函数的右花括号,则会出现不确定的行为,但这仅在执行到该点时才有风险。

在您的情况下,执行无法达到这样的程度,因此无法进行UB。

  

此错误的原因是什么?

您使用了-Werror,因此将编译器的误报警告变成了硬错误。一种解决方法是针对该特定功能禁用此警告。这纯粹是实现问题。

相关问题