static_assert of const Variable

static_assert of const Variable

本文关键字:const Variable of assert static      更新时间:2023-10-16

我有这个代码:

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中,它按预期工作。


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

foo > 0.0F不是核心常量表达式:

  1. 表达式e是核心常量表达式,除非根据抽象机的规则对e进行求值以下表达式之一:

。。。

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

(2.7.1)积分或枚举类型的非易失性glvalue引用前面带有的完整非易失性常量对象初始化,用常量表达式或初始化

(2.7.2)非易失性glvalue,指的是字符串的子对象文字,或

(2.7.3)指非易失性对象的非易失glvalue用constexpr定义,或引用的不可变子对象这样的物体或

(2.7.4)文字类型的非易失性glvalue,指的是寿命在e的评估范围内开始的非易失性对象;

foo是浮点类型,对于foo > 0.0F,需要在foo上进行左值到右值的转换,这与上述条件不匹配,则foo > 0.0F不被视为常量表达式:

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

另一方面,如果将foo声明为整型,则代码也可以。LIVE(使用constexpr而不是const也可以。LIVE)