当测试条件包含用const定义的常量时,static_assert失败?

时间:2017-07-28 18:06:54

标签: c++11 error-handling

我正在阅读Bjarne Stroustrup的书," C ++编程语言"我找到了一个解释@Query(value="", native="true")的例子。我所理解的是static_assert仅适用于可由常量表达式表达的事物。换句话说,它不能包含一个意味着要在运行时进行评估的表达式。

本书中使用了以下示例(我在代码中进行了一些更改。但我认为不应该更改本书中给出的原始示例代码所产生的任何内容。)

static_assert

上面给出了编译错误。这是使用ideone编译的:http://ideone.com/C97oF5

书中的确切代码示例:

#include <iostream>

using namespace std;

void f (double speed)
{
    constexpr double C = 299792.468;
    const double local_max = 160.0/(60*60);
    static_assert(local_max<C,"can't go that fast");
}

int main()
{
        f(3.25);
    cout << "Reached here!";
    return 0;
}

1 个答案:

答案 0 :(得分:0)

编译器在编译时不知道speed的值。有意义的是它无法在编译时评估speed < C。因此,处理行

时,预计会出现编译时错误
static_assert(speed<C,"can't go that fast");

该语言不保证在编译时评估浮点表达式。有些编译器可能会支持它,但不能依赖它。

即使浮点变量的值对于人类读者来说是“常量”,它们也不一定在编译时进行评估。来自您提供的链接的编译器的错误消息说明了这一点。

static_assert expression is not an integral constant expression

你必须找到一种使用积分表达式进行比较的方法。然而,这似乎是一个有争议的问题。我怀疑,你真正想做的是确保speed在一定限度内。这只是作为运行时检查才有意义。