Lvalue和Literal之间的比较是否会调用Lvalue-Rvalue转换?

时间:2017-10-27 17:32:37

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

是的,它被执行了。基本上,这都是因为3.0 > 1.2是一个结构良好的表达式,除了操作数之外只包含prvalues。

首先,[expr]/9陈述(强调我的)

  

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

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

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

操作数应具有算术,枚举或指针类型。该   运营商&lt; (小于),&gt; (大于),&lt; =(小于或等于),   和&gt; =(大于或等于)所有产生错误或真实。的类型   结果是布尔。

上面的语法生成是重要的一点。我们可以关注它(我不会在此处完全执行此操作)并将shift-expression缩减为primary-expressionprimary-expression的一个作品是literal。在[expr.prim.literal]中说的是:

  

文字是主要表达方式。它的类型取决于它的形式。一个   string literal是一个左值;所有其他文字都是prvalues。

因为大多数文字是prvalues,我认为可以说关系运算符期望操作数的prvalues。