const变量

时间:2017-10-26 18:49:43

标签: c++ visual-studio-2010 global-variables const static-assert

我有这段代码:

const float foo = 5.0F;

static_assert(foo > 0.0F, "foo must be greater than 0.");

但在我收到错误:

  

错误C2057:预期的常量表达式

我实际上是正确地执行此操作而没有正确实施static_assert,对吧?在中,它按预期工作。

constconstexpr之间的差异进行了一些评论。我理解这种差异,但是很多编译器都支持static_assert的使用,所以我再问一遍,这是否是合法代码?我并不关心哪个编译器支持它,我担心它是否在C ++标准下定义。

1 个答案:

答案 0 :(得分:2)

foo > 0.0F不是core constant expression

  
      
  1. 表达式e是核心常量表达式,除非根据抽象机器的规则评估e将评估一个   以下表达式:
  2.         

    ...

         

    (2.7)左值到左值的转换,除非它适用于

         

    (2.7.1)一个非整数或枚举类型的非易失性glvalue   是指具有前面的完整的非易失性const对象   初始化,用常量表达式初始化,或

         

    (2.7.2)一个非易失性glvalue,它引用一个字符串的子对象   文字,或

         

    (2.7.3)一个非易失性glvalue,它引用一个非易失性对象   用constexpr定义,或者指的是不可变的子对象   这样的对象,或

         

    (2.7.4)引用a的文字类型的非易失性glvalue   非易失性物体,其寿命始于e的评估范围内;

foo属于浮点类型,对于foo > 0.0F,需要foo上的左值到右值转换,这与上述条件不匹配,然后{{1} }}不被视为constant expression

  

常量表达式是一个glvalue核心常量表达式,它指的是一个实体,它是一个常量表达式的允许结果(如下定义),或一个prvalue核心常量表达式,其值满足以下约束

另一方面,如果将foo > 0.0F声明为整数类型,则代码可以正常。 LIVE(使用foo代替constexpr也可以。LIVE