Constexpr 变量和除法

Constexpr variable and division

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

template <int a, int b>
class Test
{
   static constexpr double c = a / b;
};

但 Clang 一直告诉我的是:

Constexpr variable 'c' must be initialized by a constant expression

奇怪的是下面的编译很好:

template <int a, int b>
class Test
{
   static constexpr double c = a / 2.f;
};

你们知道为什么 a/b 不是常量表达式吗?我如何在编译时对其求值?

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

更新

下面的例子导致与原代码的错误:

Test<10,0> test1 ;

同时:

Test<10,1> test1 ;

没有。

已解决。其中一个模板实例有 b=0。 不知何故,Clang 没有警告我除以零。 并且 +Inf 不是常量表达式。

原因:

Test<10,0> test1 ;

失败是因为你有 undefined behavior 由于被零除。这包含在 C++ 标准草案 5.6 [expr.mul] 中,它说:

If the second operand of / or % is zero the behavior is undefined

constant expressions specifically exclude undefined behavior. I am not sure what version of clang you are using but the versions I have available online do provide a divide by zero warning (see it live):

note: division by zero
static constexpr double c = a / b;
                              ^