コンマオペレーターのオーバーロードは、 *本当に *オペランドの評価の順序に影響しますか?
質問
コンマオペレーターは、左から右への評価順序を保証します。
[n3290: 5.18/1]
: :コンマオペレーターグループは左から右に。expression: assignment-expression expression , assignment-expression
コンマで区切られた式のペアは、左から右へと評価されます;左の式は、廃棄された値式です(5項)。 左式に関連するすべての値計算と副作用は、正しい式に関連するすべての値計算と副作用の前にシーケンスされます。 結果のタイプと値は、適切なオペランドのタイプと値です。結果は、正しいオペランドと同じ値カテゴリのものであり、正しいオペランドがGlalueで少しフィールドである場合、少しフィールドです。
オペレーターに関する他の唯一の条項は、評価順序について言及していません。したがって、これは、オペレーターが過負荷になっている場合でも当てはまります。
しかし、さらに、式に関する一般的なスピルで、もちろん、オペレーターを過負荷にするとルールが変更されると述べられています。
[n3290: 5/2]:
[ ノート: 演算子は過負荷にすることができます。つまり、クラスタイプ(節9)または列挙タイプ(7.2)の式に適用された場合の意味が与えられます。オーバーロードされた演算子の使用は、13.5で説明されているように、関数呼び出しに変換されます。 過負荷のオペレーターは、条項5で指定された構文の規則に従いますが、オペランドタイプ、値カテゴリ、および評価順序の要件は、関数呼び出しの規則に置き換えられます。 などのオペレーター間の関係++a
意味a+=1
, 、過負荷のオペレーター(13.5)が保証されておらず、タイプのオペランドが保証されていませんbool
. - エンドノート ]
しかし、これはです 非規範的 文章。何かありますか 規範 このルールを定義するテキスト、または準拠したコンパイラはそれを無視できますか?
解決
私は手の03標準しか持っていませんが、その中で5/3は「節5は、それらが過負荷になっていないタイプに適用された場合の演算子の効果を定義する」と述べています。
したがって、5.18/1を含むすべての条項5は、組み込みの演算子にのみ適用され、過負荷の機能には適用されません。
(準拠したコンパイラは、オペランドを常に過負荷にすることができます operator ,()
しかし、左から右に。)