14

コンマ演算子は、左から右への評価順序を保証します。

[n3290: 5.18/1]: コンマ演算子は左から右にグループ化します。

expression:
   assignment-expression
   expression , assignment-expression

コンマで区切られた式のペアは、左から右に評価されます。左の式は破棄された値の式です (箇条 5)。左の式に関連付けられたすべての値の計算と副作用は、右の式に関連付けられたすべての値の計算と副作用の前に並べられます。結果の型と値は、右側のオペランドの型と値です。結果は、右オペランドと同じ値カテゴリであり、右オペランドが glvalue とビット フィールドの場合はビット フィールドです。

演算子に関する他の唯一の句は、評価順序について言及していません。そのため、オペレーターが過負荷になっている場合でも、これが当てはまるようです。

しかし、さらに上の式に関する一般的な話では、もちろん、演算子をオーバーロードするとルールが変わることが述べられています。

[n3290: 5/2]:[注:演算子はオーバーロードできます。つまり、クラス型 (第 9 節) または列挙型 (7.2) の式に適用すると意味が与えられます。オーバーロードされた演算子の使用は、13.5 で説明されているように関数呼び出しに変換されます。オーバーロードされた演算子は、5 節で指定された構文の規則に従いますが、オペランドの型、値のカテゴリ、および評価順序の要件は、関数呼び出しの規則に置き換えられます。++a 意味などの演算子間の関係はa+=1、オーバーロードされた演算子 (13.5) に対して保証されておらず、型 のオペランドに対して保証されていませんbool—終わりのメモ]

ただし、これは非規範的なテキストです。このルールを定義する規範的なテキストはありますか、または準拠したコンパイラはそれを無視できますか?

4

1 に答える 1

10

私が手元に持っているのは 03 標準だけですが、その 5/3 には、「第 5 節は、オーバーロードされていない型に適用された場合の演算子の効果を定義する」と書かれています。

したがって、5.18/1 を含む 5 節のすべては、組み込み演算子にのみ適用され、オーバーロードされた関数には適用されません。

(ただし、準拠するコンパイラは常に、オペランドをoperator ,()左から右へのオーバーロードに評価できます。)

于 2011-10-19T12:03:28.370 に答える