我问了这个问题:static_assert of const Variable
显然,问题在于浮点左值是否为了比较而转换为右值?
那么在这段代码中是否发生了左值到右值的转换?
const float foo = 13.0F;
static_assert(foo > 0.0F, "foo must be greater than 0.");
我问了这个问题:static_assert of const Variable
显然,问题在于浮点左值是否为了比较而转换为右值?
那么在这段代码中是否发生了左值到右值的转换?
const float foo = 13.0F;
static_assert(foo > 0.0F, "foo must be greater than 0.");
是的,它被执行了。基本上,这都是因为它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。结果的类型是 bool。
上面的语法产生是重要的一点。我们可以按照它(我不会在这里完全这样做)并减少shift-expression
到primary-expression
. a 的产生式之一primary-expression
是 a literal
。在[expr.prim.literal]中说:
文字是主要的表达方式。它的类型取决于它的形式。字符串文字是左值;所有其他文字都是纯右值。
而且因为大多数文字都是纯右值,我认为可以肯定地说关系运算符期望操作数的纯右值。