三項オプターで両方の分岐が同じ基本型を持つか、1つに変換可能でなければならない理由を説明する論理的な理由はありますか? このルールがないことの何が問題なのですか?なぜ私はこのようなことをすることができないのですか (これは最良の例ではありませんが、私の言いたいことを明確にしています):
int var = 0;
void left();
int right();
var ? left() : right();
三項オプターで両方の分岐が同じ基本型を持つか、1つに変換可能でなければならない理由を説明する論理的な理由はありますか? このルールがないことの何が問題なのですか?なぜ私はこのようなことをすることができないのですか (これは最良の例ではありませんが、私の言いたいことを明確にしています):
int var = 0;
void left();
int right();
var ? left() : right();
式は、コンパイル時に既知の型である必要があります。「XまたはY」タイプの式を使用することはできません。どちらか一方である必要があります。
この場合を考えてみましょう:
void f(int x) {...}
void f(const char* str) {...}
f(condition ? 5 : "Hello");
どのオーバーロードが呼び出されますか?これは単純なケースであり、コンパイル時に知っておく必要のあるテンプレートなど、より複雑なケースがあります。したがって、上記の場合、コンパイラは条件に基づいてオーバーロードを選択せず、常に呼び出すために1つのオーバーロードを選択する必要があります。
それはできないので、三項演算子の結果は常に同じタイプ(または互換性がある)でなければなりません。
三項演算子は、分岐の値を返します。2 つの分岐の両方が同じ型でない場合、式は不定型になります。
ポイントは、式には静的に定義された型が必要だということです。
三項演算子の分岐に互換性がない場合、三項式の型を静的に推測することはできません。
三項演算子には定義済みの戻り値が必要だからだと思います。両方のブランチのタイプが異なる場合、または void の場合は実行が困難です。