std::common_type
was introduced for use with std::duration
— if you add a std::duration<int>
and a std::duration<short>
then the result should be std::duration<int>
. Rather than specifying an endless stream of allowed pairings, the decision was made to delegate to a separate template which found the result using the core language rules applicable to the ?:
arithmetic-if operator.
People then saw that this template might be generally useful, and it was added as std::common_type
, and extended to handle an arbitrary number of types. In the C++0x library it is only used for pairs of types though.
You should be able to use the new SFINAE rules to detect whether or not some instantiation of std::common_type
is valid. I haven’t tried though. In most cases if there isn’t a “common type” then there isn’t anything meaningful you can do anyway, so a compile error is reasonable.
std::common_type
is not magic — it follows the rules of ?:
. If true?a:b
will compile, std::common_type<decltype(a),decltype(b)>::type
will give you the type of the result.