7

私はインターネットでかなり多くのことを読んでいますが、多くの人が次のルールについて言及しているようです(しかし、私はそれを標準で見つけることができませんでした)、

加算演算子+(および他のすべての二項演算子)では、両方のオペランドが右辺値である必要があり、結果は右辺値になります。等々..

C ++標準を確認したところ、(3.10 / 2節)と明確に述べられています。

prvalueが期待されるコンテキストでglvalueが表示されると、glvalueはprvalueに変換されます。

(5/9節)、

glvalue式が、そのオペランドのprvalueを期待する演算子のオペランドとして表示される場合は常に、左辺値から右辺値(4.1)、配列からポインター(4.2)、または関数からポインター(4.3)の標準変換が行われます。式をprvalueに変換するために適用されます。

これは、オペランドがprvalueを「期待する」という用語を使用します。ただし、加算演算子、乗算演算子などを調べると、結果はprvalueであるとしか言及されていませんが、オペランドが「期待される」ものについては何も述べられていません。

二項演算子が実際にオペランドがprvalueであることを期待しているかどうかは、次の場合に違いがあります。

int b = 2;
int a = b + 1;

bがprvalueであると予想される場合、ここで左辺値から右辺値への変換が行われ、次にprvalue + prvalueが実行され、prvalueが返され、結果のprvalueが左辺値aに割り当てられます。

ただし、bがprvalueである必要がない場合は、lvalue + prvalueになり、結果はprvalueになります。

標準が明示的または暗黙的にさまざまな演算子のルールについて言及している場所を本当に知りたいですか?私はすべての演算子のセクションをチェックし、オペランドと結果が左辺値か右辺値かを標準で明示的に言及している演算子はごくわずかです。ほとんどの演算子の場合、標準では結果のみが記載されており、オペランド要件は記載されていません。

ありがとう。


ところで、定数式に関する標準5.19で、二項演算子がオペランドで左辺値から右辺値への変換を必要とすることを非常に「暗黙的に」暗示している可能性があることを発見しました。詳細については、前の質問を参照してください。

constexprとconstの混合使用?

条件式は、評価される可能性のある部分式として次のいずれかが含まれない限り、定数式です(3.2)。

..。

—左辺値から右辺値への変換(4.1)

————定数式で初期化された、先行する初期化を伴う不揮発性constオブジェクトを参照する整数型または列挙型のglvalue

読んでくれてありがとう。

4

2 に答える 2

1

(まず、私の英語で申し訳ありません。訂正は大歓迎です)

標準は次のように述べています。

§5.7-3 二項 + 演算子の結果は、オペランドの合計です。[...]

式があり、選択されe1 + e2+演算子が組み込み式であり、式が適切な形式でe1ありe2、算術型であるか、算術型へのキャストが利用可能であり、すべてが問題なく、問題なく、完璧であるとしましょう!

したがって、規則 §5.7-3 が適用されます。一方、各オペランドは式です。

§5-1 [: [...] 式は、計算を指定する一連の演算子とオペランドです。式は値になり、副作用を引き起こす可能性があります。—エンドノート]

式や関数のように、式は式によって値になる可能性があると述べていますが、完全に定義された式であると述べたので、動詞「できる」を省略できます。したがって、次のことを確認できます。式の結果は値になりますvoiddeletevoide1 + e2

最後のポイント: 算術および論理組み込み演算子については、標準では指定されていませんが、オペランドの値カテゴリに関係なく、そのオペランドの値のみが重要であることを理解しています。

+値のみが重要であり、式を通じて値に到達できるため、組み込み演算子 (およびその他の算術演算子) を実装するには、with 式で十分だと思います。このため、標準ではそれらを明確に定義していません。

それでも、この種のものは非常に悪い構造になっています。たとえば、演算子が直接の値ではなくオペランドとしてオブジェクトを受け取る場合 (私が現在解決しようとしている疑い)、演算子が演算子を計算するためにその値を直接取得する必要がある場合、場所を指定する場所が見つかりませんでした。値はオブジェクトの評価の結果などです。価値観だけが重要であることは明らかですが、これらの基準が正確に何を言っているのかは一種の謎です.

于 2014-02-10T15:05:27.457 に答える