【问题标题】:Does a Comparison Between an Lvalue and a Literal Invoke an Lvalue-to-Rvalue Conversion?左值和文字之间的比较会调用左值到右值的转换吗?
【发布时间】:2017-10-27 17:32:36
【问题描述】:

我问了这个问题:static_assert of const Variable

显然,问题在于浮点左值是否会转换为右值以进行比较?

那么在这段代码中是否发生了左值到右值的转换?

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

【问题讨论】:

  • foo 是float。 0.0 是 double。 必须进行转换才能比较两者,因为原始类型不匹配。
  • @JesperJuhl 谢谢,我犯了复制粘贴错误。我已经纠正了。我在问文字与左值类型相同的情况。
  • 对谁来说,这似乎是this answer“值和表达式”部分的症结所在

标签: c++ comparison rvalue lvalue lvalue-to-rvalue


【解决方案1】:

是的,已执行。基本上,这都是因为3.0 > 1.2 是一个格式良好的表达式,它只包含操作数的纯右值。

首先,[expr]/9 声明(强调我的)

当泛左值表达式作为运算符的操作数出现时 期望该操作数的纯右值,即左值到右值, 数组到指针或函数到指针的标准转换是 应用于将表达式转换为纯右值。

所以问题真的归结为“关系运算符是否期望操作数的纯右值”?答案也是肯定的。因为我们需要考虑[expr.rel]/1:

relational-expression:
  shift-expression
  relational-expression < shift-expression
  relational-expression > shift-expression
  relational-expression <= shift-expression
  relational-expression >= shift-expression

操作数应具有算术、枚举或指针类型。这 运算符 (大于)、=(大于或等于)都产生 false 或 true。的类型 结果是布尔值。

上面的语法产生是重要的一点。我们可以按照它(我不会在这里完全这样做)并将shift-expression 减少为primary-expression。 primary-expression 的产生之一是literal。 [expr.prim.literal]:

文字是主要的表达式。它的类型取决于它的形式。一种 字符串文字是一个左值;所有其他文字都是纯右值。

并且因为大多数文字都是纯右值,我认为可以肯定地说关系运算符 expect 是操作数的纯右值。

【讨论】:

  • 这是一个很好的答案,但是如果我不与 glvalues 和 prvalues 斗争的话。每次阅读时,我都必须查找它们。 rvalues 和 lvalues 对我来说是熟悉和安全的,因为它们基本上在我成为 C++ 程序员的整个时间里就一直存在......但是......你有启发式方法或者你用来帮助思考 glvalues 的东西吗? prvalues?
  • @JonathanMee - 我认为可以肯定地说纯右值与 C 认为的右值非常相似。 IE。任何不可分配的东西。一个“纯值”,可能没有对象来支持它。泛左值就是您可以分配给的任何东西(假设它不是 const)。因此,您可以通过实际名称或对它的引用(左值或右值引用)来命名任何对象。除了 UB,引用总是涉及被引用的对象占用存储。但就像所有启发式方法一样,它经常让我失望,即使我可以在日常工作中应付它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多