0

コンテキスト:式テンプレートと C++11 機能の作成をいじっています。添付のコード サンプルは、単なる楽しみのための実験です。この ET のバリエーションでは、各式が独自の戻り値の型を追跡します。common_type次に、コンパイラは、部分式の戻り値の型に基づいて、他の式の戻り値の型を見つけるために使用します。

問題:ここで完全な例を見ることができます

common_type次のように使用して戻り値の型を動的に把握する一連の関数があります。

template
    <
        typename... Args2,
        typename T1,
        template < typename... > class T2
    >
    Binary
    <
        T1,
        T2< Args2... >,
        typename common_type< T1 , typename select_last< Args2... >::type >::type
    > const
    operator*(T1 u, T2< Args2... > v)
{
    cout << "Operator (value, expr)" << endl;
    return Binary
    <
        T1,
        T2< Args2... >,
        typename common_type< T1 , typename select_last< Args2... >::type >::type
    >(u, v);
}

すべてをコンパイルすると、 正常にclang++ -std=c++11 -O3 -Wall -pedantic -Wextra main.cpp -lboost_iostreams -lz動作します。でコンパイルするとclang++ -stdlib=libc++ -std=c++11 -O3 -Wall -pedantic -Wextra main.cpp -lcxxrt -ldl -lboost_iostreams -lz、非プリミティブが に渡されるビルド エラーが発生しcommon_typeます。(別名incompatible operand types ('Unary<int, int>' and 'int'))

質問:一致する関数が間違っていませんか? common_type使用していない機能でも評価される場合があるようです。common_type2 つの終端式演算子の評価を遅らせる簡単な方法はありますか?

4

0 に答える 0