Тип условного выражения не зависит от того, является ли условие истинным или нет.
decltype(b<a?a:b)
- это тип выражения b<a?a:b
, которое всегда одинаково.
Это не либо decltype(a)
, либо decltype(b)
в зависимости от значения b<a
.
Обратите внимание, что выражение, которое вы даете decltype
, никогда не вычисляется - определяется только его тип, и оно определяется во время компиляции.
Несколько неофициально:
- , если
a
можно преобразовать в тип b
, выражение имеет тот же тип, что и b
- , если
b
можно преобразовать в тип a
, выражение имеет тот же тип, что и a
- , в противном случае выражение имеет неверный тип.
(естьтакже куча мельчайших подробностей о стандартных конверсиях и задействованном яда-яде, но это суть этого.)
Например, это не скомпилируется, потому что нет действительных конверсий, которые могли бы дать notgood
тип:
int main()
{
decltype(true ? "hello" : 123.4) notgood;
}
, пока он будет компилироваться, запускаться и иметь четкое определение, поскольку недопустимая разыменование никогда не оценивается:
int main()
{
decltype(*(int*)0 + 1)` x = 0;
return x;
}