我有这段代码:
const float foo = 5.0F;
static_assert(foo > 0.0F, "foo must be greater than 0.");
但在visual-studio-2010我收到错误:
错误C2057:预期的常量表达式
我实际上是正确地执行此操作而visual-studio-2010没有正确实施static_assert
,对吧?在visual-studio-2017中,它按预期工作。
对const
和constexpr
之间的差异进行了一些评论。我理解这种差异,但是很多编译器都支持static_assert
的使用,所以我再问一遍,这是否是合法代码?我并不关心哪个编译器支持它,我担心它是否在C ++标准下定义。
答案 0 :(得分:2)
foo > 0.0F
不是core constant expression:
- 表达式e是核心常量表达式,除非根据抽象机器的规则评估e将评估一个 以下表达式:
醇>...
(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)