1. ホーム
  2. c++

[解決済み】'?:'の戻り値型 (三項条件演算子)

2022-04-09 06:12:57

質問

なぜ1つ目は参照を返すのですか?

int x = 1;
int y = 2;
(x > y ? x : y) = 100;

2番目はそうでないのに対して?

int x = 1;
long y = 2;
(x > y ? x : y) = 100;

実は、2つ目は全くコンパイルできませんでした - "not lvalue left of assignment".

解決方法は?

式には戻り値がありません。式には型と、最新のC++規格で知られているように、値のカテゴリがあります。

条件式は または rvalue . これは、その値のカテゴリです。(これは多少簡略化したものです。 C++11 には、lvalues、xvalues、prvaluesがあります)。

非常に大雑把で簡単な言い方をすれば はメモリ上のオブジェクトを意味し rvalue は単なる値であり、必ずしもメモリ上のオブジェクトに付随しているとは限りません。

代入式はオブジェクトに値を代入するので、代入されるものは必ず .

条件式の場合 ( ?: ) を (これも大雑把で簡単な言い方ですが)です。 第2オペランドと第3オペランドは、必ず lvalues 同じ型の . これは、条件式の型と値のカテゴリはコンパイル時に決定され、条件が真であろうとなかろうと適切でなければならないからである。もしオペランドの一方を別の型に変換して一致させなければならないのなら、その条件式は というのは、この変換の結果は .

ISO/IEC 14882:2011の参考文献です。

3.10 [basic.lval] Lvaluesとrvalues(値のカテゴリについて)

5.15 [expr.cond] 条件演算子(条件式がどのような型と値のカテゴリを持つかのルール)

5.17 [expr.ass] 代入および複合代入演算子(代入の l.h.s は変更可能な l 値でなければならないという要件があります)。