[解決済み】'?:'の戻り値型 (三項条件演算子)
質問
なぜ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 値でなければならないという要件があります)。
関連
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] オブジェクトの種類を決定しますか?
-
[解決済み] 型チェック:typeof、GetType、is?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] Kotlin 三項条件演算子
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】C++の余分な資格エラー
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む