Constexpr变量和除法

时间:2015-03-23 23:27:45

标签: c++ templates c++11 constexpr

我正在尝试使用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不是一个常量表达式,我怎么能在编译时对它进行评估?

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

更新

以下示例使用原始代码导致错误:

Test<10,0> test1 ;

,同时:

Test<10,1> test1 ;

没有。

2 个答案:

答案 0 :(得分:4)

之所以:

Test<10,0> test1 ;

失败是因为你将undefined behavior归为零。这在C ++标准草案5.6 [expr.mul] 草案中有所说明:

  

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

constant expressions specifically exclude undefined behavior。我不确定您使用的clang版本是什么,但我在线提供的版本确实提供了除零警告( see it live ):

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

答案 1 :(得分:1)

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