3

以下は、 の特殊化の 1 つですstd::common_type

template <class T, class U>
struct common_type<T, U> {
    typedef decltype(true ? declval<T>() : declval<U>()) type;
};

私の考えでは、条件ステートメントは不要です。に対してチェックしている場合true、式は常に に解決されdeclval<T>()ませんか? もしそうなら、返されたtypedefはどのように定義を正当化します...

「すべての型の間で共通の型を決定しますT...。これは、すべてT...が暗黙的に変換できる型です。」

誰かが条件文を説明してもらえますか? チェックtrueが不要であり、条件が常に最初のオペランドに解決されることは正確ですか? もしそうなら、返される型はどのように定義を満たしますか?

4

3 に答える 3

6

三項条件式の型、2 つの引数型の共通型です。したがって、三項式は共通型の定義として使用できます。

decltypeはその引数を評価しないことに注意してください。条件が true か false かは重要ではありません。

于 2013-01-14T22:36:24.383 に答える
4

三項演算子の型は、コンパイラが取る必要があると認識している分岐の型だけではありません。そのようなタイプがあれば、両方のブランチに共通するタイプです。そのような型がない場合、コンパイルは失敗します。三項演算子は、2 つの値に対する式の結果ではなく、式の共通の型に変換するプロパティを持つ唯一の演算子です。つまり、三項演算子は、共通の型を取得するために悪用されているだけです。ただし、状態は重要ではありません。

標準の関連セクションは、5.16 [expr.cond] パラグラフ 3 です。

それ以外の場合、2 番目と 3 番目のオペランドが異なる型を持ち、どちらかが (おそらく cv 修飾された) クラス型を持っている場合、または両方が同じ値カテゴリの glvalue で cv 修飾を除いて同じ型である場合、それぞれの変換が試行されます。それらのオペランドを他の型に変換します。

パラグラフに続いて、共通タイプを提供する方法のルールを示します。それ以外の場合は、2 番目または 3 番目の式のいずれかがthrow-expressionであるか、2 番目または 3 番目の式の一方または両方が type を持つ場合を指し voidます。

于 2013-01-14T22:42:29.910 に答える
2

他の説明は正しいですが、単純なサンプル プログラムで三項演算子がどのように機能するかを示すことができると思いました。

int main() {
    std::cout << demangle(typeid(true ? 1 : 3.14).name()) << std::endl;
}

上記のliveworkspace上のプログラムはdouble、2 番目のオペランドがint. これは、三項演算子の結果が2 番目と 3 番目のオペランド (この場合はand ) の間で共通の型であるためです。このオペレーターに申し込むと、これが得られます。intdoubledecltype

于 2013-01-14T22:59:02.640 に答える