Lvalue和Literal之间的比较是否调用Lvalue到Rvalue的转换



我问了这个问题:const变量的static_assert

显然,这归结为一个问题,浮点左值是否会为了比较而转换为右值?

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

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

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

首先,[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

操作数应具有算术、枚举或指针类型。这个运算符<(小于),>(大于),<=(小于或等于),和>=(大于或等于)都产生假或真。的类型结果是bool。

上面的语法生成是重要的一点。我们可以遵循它(我不会在这里完全这么做),并将shift-expression简化为primary-expression。而一个primary-expression的乘积之一就是一个literal。在[expr.prim.literal]中有这样的说法:

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

因为大多数文字都是prvalue,我认为可以肯定地说,关系运算符期望操作数为prvalue。

最新更新