Класс шаблона std::common_type
вычисляет общий тип для списка вариационного типа. Он определяется с помощью возвращаемого типа тернарного оператора x:y?z
рекурсивно. Из этого определения мне не очевидно, рассчитывает ли a std::common_type<X,Y>
ассоциативно, т.е. е. ли
using namespace std;
static_assert( is_same<common_type< X, common_type<Y,Z>::type >::type,
common_type< common_type<X,Y>::type, Z >::type>::value, "" );
никогда не будет вызывать ошибку времени компиляции для всех типов X
, Y
и Z
, для которых справедливо выражение is_same<...>
.
Обратите внимание, что я не спрашиваю,
static_assert( is_same<common_type<X,Y>::type,
common_type<Y,X>::type>::value, "" );
будет когда-либо стрелять. Это, очевидно, не будет. Вышеупомянутый вопрос совершенно другой.
Обратите внимание, что спецификация std::common_type
слегка изменилась в С++ 14 и, вероятно, снова изменится на С++ 17. Таким образом, ответы могут отличаться для разных версий стандарта.