Существуют ли правила неявного преобразования типов для аргументов тернарного оператора?
Тернарный оператор всегда должен возвращать один и тот же тип. Этот тип определяется исключительно вторым и третьим аргументом (1st ? 2nd : 3rd
), поэтому оба аргумента преобразуются в этот тип. Как определяется этот тип?
Чтобы быть более конкретным, я протестировал пример:
class pointclass
{
pointclass();
pointclass( int i ); // (pointclass)(int)
operator bool() const; // (bool)(pointclass)
};
У меня есть класс (pointclass
), который позволяет неявное преобразование из int
в pointclass
и неявное преобразование из pointclass
в bool
.
int i;
pointclass p;
bool b;
b ? p : i; // (bool) ? (int)(bool)(pointclass) : (int)
b ? i : p; // (bool) ? (int) : (int)(bool)(pointclass)
Используя тернарный оператор, я сравниваю pointclass
и int
. Компилятор использует неявное преобразование из pointclass
в bool
, а затем стандартное преобразование из bool
в int
. Это делается независимо от того, обмениваюсь ли я вторым и третьим аргументами. Почему не преобразуется int
в pointclass
?
Использование оператора сравнения намного проще:
p == i; // (pointclass) == (pointclass)(int)
i == p; // (int) == (int)(bool)(pointclass)
Тип аргументов просто определяется первым аргументом.
Но я не понимаю правил преобразования типов тернарного оператора. Для меня это похоже на использование способа большинства конверсий.
int
не является классом, и если бы он был с каким-тоObject
базовым классом бога, он был бы его братом. Кроме того, если у вас есть базовый класс и производный класс, вы не можете уменьшить базовый класс, потому что вы даже не знаете, является ли его динамический тип этим производным классом. - person chris   schedule 27.08.2015