繁体   English   中英

const 变量的 static_assert

[英]static_assert of const Variable

我有这个代码:

const float foo = 5.0F;

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

但是在我得到了错误:

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

我实际上是在正确地做这件事,而只是没有正确实现static_assert ,对吧? 它按预期工作。


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

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

  1. 表达式 e 是核心常量表达式,除非按照抽象机器的规则对 e 求值会求值以下表达式之一:

...

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

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

(2.7.2) 引用字符串文字的子对象的非易失性泛左值,或

(2.7.3) 非易失性泛左值,它指的是用 constexpr 定义的非易失性对象,或指的是此类对象的非可变子对象,或

(2.7.4) 文字类型的非易失性泛左值,它指的是一个非易失性对象,其生命周期开始于 e 的求值内;

foo是浮点类型, foo > 0.0F左值到右值转换上foo是必需的,它不符合上述条件,则foo > 0.0F不被认为是常量表达式

常量表达式要么是泛左值核心常量表达式,它指的是作为常量表达式(如下定义)的允许结果的实体,要么是其值满足以下约束的纯右值核心常量表达式

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM