Существуют ли правила для неявного преобразования типов для аргументов тройного оператора?C++: Тернарный оператор (условный оператор) и его правила неявного преобразования типов
Тернарный оператор всегда должен возвращать тот же тип. Этот тип определяется исключительно вторым и третьим аргументом (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
. Это делается независимо от того, могу ли я заменить 2-й и 3-й аргументы. Почему он не конвертирует int
в pointclass
?
Использование оператора сравнения гораздо проще:
p == i; // (pointclass) == (pointclass)(int)
i == p; // (int) == (int)(bool)(pointclass)
тип аргументов просто определяется первым аргументом.
Но я не понимаю правила преобразования типов тернарного оператора. Для меня это похоже на использование большинства конверсий.
Да, правила находятся в [expr.cond] в стандарте. – chris
Кто-то, более знакомый стандартными способами, чем я, может дать авторитарный ответ, но, как правило, они преобразуются в «самый близкий» общий тип, к которому они могут быть преобразованы. – SergeyA
Если вы считаете, что C++ делает фанковые вещи, позаботьтесь о бедных парнях Java. – Bathsheba