g ++在static_assert

时间:2015-08-26 12:08:11

标签: c++ c++11

使用g++ 4.8.2-std=c++11标记编译以下代码时,编译时没有错误:

    constexpr double C = 299792.458;
    const double local_max = 3.5;
    static_assert(local_max < C, "can't go that fast");

编译以下代码时会出错:

    constexpr double C = 299792.458;
    double x = 3.5;
    const double local_max = x;
    static_assert(local_max < C, "can't go that fast");

错误讯息:

  

a.cc:在函数'int main()'中:

     

a.cc:6:2:错误:静态断言的非常数条件
  static_assert(local_max&lt; C,&#34;不能那么快&#34;);

     

a.cc:6:2:错误:'local_max'的值在常量中不可用   表达

     

a.cc:5:15:注意:'local_max'未被声明为'constexpr'const   double local_max = x;

我的问题是为什么它在第一种情况下不会出错。

是否取决于const变量是否使用constexpr进行初始化?

2 个答案:

答案 0 :(得分:3)

之后,你完全正确
const double local_max = 3.5;

local_max仍然不应该是编译时常量。这是一个编译器错误,已在GCC 5.1中修复。您可以在gcc.godbolt.org上验证这一点,您将在其中看到GCC的错误消息,包括:

  

错误:'local_max'的值在常量表达式中不可用

  

注意:'local_max'未被声明为'constexpr'

答案 1 :(得分:-1)

第一个版本正在运行,因为local_max不会在内存中。无论何时使用local_max,它都将被替换为它的值,这在编译时是已知的。所以你可以根据它调用static_assert。

然而,在第二个版本中,local_max基于x得到它的值,它在运行时得到它的值。

您不能基于在运行时获取它的值的变量来创建static_assert,因为static_assert是编译时断言。