我有这个代码:
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++标准下定义的。
foo > 0.0F
不是核心常量表达式:
- 表达式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)