Constexpr 变量和除法

sta*_*ats 3 c++ templates constexpr c++11

我正在尝试使用 C++11 新的 constexpr 功能在编译时评估这个简单的表达式:

template <int a, int b>
class Test
{
   static constexpr double c = a / b;
};
Run Code Online (Sandbox Code Playgroud)

但这是 Clang 一直告诉我的:

Constexpr variable 'c' must be initialized by a constant expression
Run Code Online (Sandbox Code Playgroud)

奇怪的是,以下编译得很好:

template <int a, int b>
class Test
{
   static constexpr double c = a / 2.f;
};
Run Code Online (Sandbox Code Playgroud)

你们知道为什么 a/b 不是常量表达式,我怎么能在编译时评估它?

使用带有 -std=c++1y 和 -stdlib=libc++ 的 Clang 编译器

更新

以下示例导致原始代码出现错误:

Test<10,0> test1 ;
Run Code Online (Sandbox Code Playgroud)

尽管:

Test<10,1> test1 ;
Run Code Online (Sandbox Code Playgroud)

才不是。

Sha*_*our 5

之所以:

Test<10,0> test1 ;
Run Code Online (Sandbox Code Playgroud)

失败是因为您因除以零而具有未定义的行为。这在 C++ 标准草案部分5.6 [expr.mul] 中有介绍,其中说:

如果 / 或 % 的第二个操作数为零,则行为未定义

常量表达式专门排除未定义的行为。我不确定clang您使用的是哪个版本,但我在线提供的版本确实提供了除以零警告(实时查看):

note: division by zero
static constexpr double c = a / b;
                              ^
Run Code Online (Sandbox Code Playgroud)