【问题标题】:static_assert of const Variableconst 变量的 static_assert
【发布时间】:2017-10-26 18:49:42
【问题描述】:

我有这个代码:

const float foo = 5.0F;

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

但是在 我得到了错误:

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

我实际上做得正确, 只是没有正确实施static_assert,对吧?在 中,它按预期工作。


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

【问题讨论】:

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


【解决方案1】:

foo > 0.0F 不是core constant expression

  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 不被视为@987654322 @:

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

另一方面,如果将foo 声明为整数类型,则代码会很好。 LIVE(使用constexpr 代替const 也可以。LIVE

【讨论】:

  • 所以我很欣赏这个评论,它一定有一些优点,因为我确实在这里看到了 2.7.1。但是为什么foo 的比较需要左值到右值的转换呢?好像我正在将左值与原始文字进行比较。
  • @JonathanMee 难题。来自this answer,“我们需要左值到右值的转换来访问对象内部的值”,所以需要左值到右值的转换来提取foo的值进行比较。更准确地说,operator> 期望它的操作数是纯右值。顺便说一句,如果您直接使用文字代码将compile,则根本不需要左值到右值的转换。
  • 我很难找到明确的说明,即浮点比较调用左值到右值比较。鉴于您的标准报价,似乎可以肯定这确实会发生,但在接受此答案之前,我仍然希望明确澄清。问题在这里:stackoverflow.com/q/46980595/2642059
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多