3

NicolaiM.Josuttisによる本「TheCppstandardlibrary」、第2版では、構造体の共通型の定義は次のようになっています(5.4、p.125)。

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

これがcommon_typeの正しい定義であると信じるのに深刻な問題があります。理由:

typedef decltype(true ? declval<T1>() : declval<T2>()) type;//As far as I understand this will always pick second operand, declval<T1>(), due to the fact that there is 'true' value. Am I right?
4

1 に答える 1

4

それはすべて条件演算子についてです。if や switch のような選択文ではありません。

ISO C++11 標準の 5.16 パラグラフ:

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

したがって、decltype に true 条件が含まれていてもかまいません。コンパイラは結果として共通の型を選択する必要があります。

UPD: 5.16 には、正しい動作の詳細な説明が含まれています。プロセス全体を完全に理解するために参照してください。しかし、あなたの特定の質問について:

このプロセスを使用して、第 2 オペランドが第 3 オペランドと一致するように変換できるかどうか、および第 3 オペランドが第 2 オペランドと一致するように変換できるかどうかが判断されます。両方を変換できる場合、または一方を変換できても変換があいまいな場合、プログラムは不正な形式です。どちらも変換できない場合、オペランドは変更されずに残され、以下で説明するようにさらにチェックが実行されます。変換が 1 つだけ可能である場合、その変換は選択されたオペランドに適用され、変換されたオペランドは、このセクションの残りの部分で元のオペランドの代わりに使用されます。

于 2012-11-07T12:38:02.347 に答える