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