3

私はこの質問をしました: const 変数の static_assert

そしてどうやら、比較のために浮動小数点の左辺値が右辺値に変換されるのかという問題に帰着しますか?

このコードでは、左辺値から右辺値への変換が発生しますか?

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

1 に答える 1

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

オペランドは、算術型、列挙型、またはポインター型でなければなりません。演算子 < (より小さい)、> (より大きい)、<= (より小さいか等しい)、および >= (より大きいか等しい) はすべて、false または true を返します。結果の型は bool です。

上記の文法生成は重要なビットです。それに従うことができます (ここでは完全には行いませんshift-expression) primary-expression。そして a の生成物の 1 つprimary-expressionが aliteralです。[expr.prim.literal]でそれが言われていることについて:

リテラルは一次式です。その種類はその形状によって異なります。文字列リテラルは左辺値です。他のすべてのリテラルは prvalues です。

またほとんどのリテラルは prvalue であるため、関係演算子はオペランドに prvalue を期待していると言っても過言ではないと思います。

于 2018-01-16T11:21:51.940 に答える