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;
^
我正在尝试使用 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;
^