我正在尝试使用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 ;
没有。
答案 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
不是常量表达式。