コンテキスト:式テンプレートと 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_type
2 つの終端式演算子の評価を遅らせる簡単な方法はありますか?