12

std::common_typeそれがどのように機能するかを確認するために、ヘッダーの libstdc++ 実装を調べましたtype_traits。私はそれがどのように機能するかを本当に理解していないことを認めなければなりません。ここにあります:

/// common_type
template<typename... _Tp>
    struct common_type;

template<typename _Tp>
    struct common_type<_Tp>
    { typedef _Tp type; };

template<typename _Tp, typename _Up>
    struct common_type<_Tp, _Up>
    { typedef decltype(true ? declval<_Tp>() : declval<_Up>()) type; };

template<typename _Tp, typename _Up, typename... _Vp>
    struct common_type<_Tp, _Up, _Vp...>
    {
        typedef typename
        common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type;
    };

第 1 宣言、第 2 宣言、第 4 宣言の仕組みがよくわかりました。ただし、3 番目の宣言がどのように機能するかを理解することはできません。誰かがここで使われているメカニズムを説明してくれませんか?

4

3 に答える 3

4

3 番目のバージョンでは、条件演算子を使用して共通の型を決定します。そのルールは、標準のセクション 5.16 でかなり詳しく説明されているため、ここにコピーする必要があるかどうかはわかりません。

簡単に言えば、式:

boolean-expression ? second-operand : third-operand

存在する場合、第 2 オペランドと第 3 オペランドの「共通型」を持ちます。decltype指定子は、式を型指定子に「変換」するために使用されます。

于 2012-09-05T21:32:56.437 に答える
1

長い話短い: decltype は、C++ コンパイラに最も近い先祖の型を決定させます。

三次演算子は、可能な 2 つの式の最も近い祖先の結果の静的型を持ちます。

例えば:

A が B から継承する

X は Y から継承 B から継承

<expression> ? <expression with static type A> : <expression with static type X> 
    = <expression with static type B>  // this is how the C++ parser sees it

これが C++ 言語のしくみです。decltype は、typedef をその式の結果の静的型にするだけです (C++ コンパイラがそれを決定する型は何でも)。

于 2012-09-05T21:35:40.987 に答える