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)
才不是。
之所以:
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)
| 归档时间: |
|
| 查看次数: |
818 次 |
| 最近记录: |