web-dev-qa-db-ja.com

三項演算子の戻り型はどのように決定されますか?

私はチェス盤での司教の動きに関する問題を解決していました。コードのある時点で、次のステートメントがありました。

std::cout << (abs(c2-c1) == abs(r2-r1)) ? 1 : 2 << std::endl;

これにより、次のエラーが生成されます。

error: invalid operands of types 'int' and '<unresolved overloaded function type>' to binary 'operator<<'

ただし、コードに追加の変数を含めることで、このエラーを即座に修正しました。

int steps = (abs(c2-c1) == abs(r2-r1)) ? 1 : 2;
std::cout << steps << std::endl;

三項演算子はどのように機能し、戻り値の型はどのように決定されますか(コンパイラーが<unresolved overloaded function type>)?

32
Meraj al Maksud

cppreference によると:

式を解析する場合、上の表の行に優先順位でリストされている演算子は、括弧のように、より低い優先順位でその下の行にリストされている演算子よりも引数に強くバインドされます。たとえば、式std::cout << a & bおよび*p++は、*(p++)または(std::cout << a) & bではなく、(*p)++およびstd::cout << (a & b)として解析されます。

同じ優先順位を持つ演算子は、結合性の方向で引数に束縛されます。たとえば、式a = b = ca = (b = c)として解析され、代入の右から左への結合性のため(a = b) = cではなく解析されますが、a + b - c(a + b) - cとして解析され、左から-であるためa + (b - c)ではありません加算と減算の正しい関連性。

連想性の指定は単項演算子には冗長であり、完全を期すためにのみ表示されています。単項前置演算子は常に右から左に関連付けます(delete ++*pdelete (++(*p)))であり、単項後置演算子は常に左から右に関連付けます(a[1][2]++((a[1])[2])++)。連想性は、単項後置演算子でグループ化されていても、メンバーアクセス演算子にとって意味があることに注意してください。a.b++は、a.(b++)ではなく(a.b)++として解析されます。

演算子の優先順位は、演算子のオーバーロードの影響を受けません。たとえば、std::cout << a ? b : c;(std::cout << a) ? b : c;として解析されます。これは、算術左シフトの優先順位が条件演算子よりも高いためです。

0
Meraj al Maksud