Ответ 1
std::common_type
был введен для использования с std::duration
--- если вы добавите std::duration<int>
и a std::duration<short>
, тогда результат должен быть std::duration<int>
. Вместо того, чтобы указывать бесконечный поток разрешенных пар, было принято решение делегировать отдельный шаблон, который нашел результат, используя правила основного языка, применимые к оператору арифметики ?:
.
Затем люди увидели, что этот шаблон обычно полезен, и он был добавлен как std::common_type
и расширен для обработки произвольного количества типов. В библиотеке С++ 0x он используется только для пар типов.
Вы должны иметь возможность использовать новые правила SFINAE для определения того, действительна ли какая-либо инстанция std::common_type
. Я еще не пробовал. В большинстве случаев, если нет "общего типа", то нет ничего значимого, что вы можете сделать в любом случае, поэтому ошибка компиляции является разумной.
std::common_type
не является магическим - он следует правилам ?:
. Если true?a:b
будет компилироваться, std::common_type<decltype(a),decltype(b)>::type
даст вам тип результата.