В первом случае компилятор блокируется, прежде чем даже получить назначение.Упрощенное выражение:
(true ? std::toupper : std::tolower)
Не удастся скомпилировать, если имеется несколько перегрузок toupper
/ tolower
.Это связано с тем, что тип возвращаемого значения троичного оператора должен быть установлен исключительно на основе типов 2-го и 3-го аргумента, без учета контекста, в котором используется его результат.
Достаточно забавно, даже если один из нихАргументы не являются перегруженной функцией, этого все еще недостаточно.Причины этого менее очевидны и имеют большее отношение к правилам разрешения перегрузки 1 и их применению.Приведение - это точно одна из семи возможностей для его запуска, и определение целевого типа самих троичных операторов не является.
В случае прямого присваивания правые стороны присваивания должны соответствовать lhs, и поэтомунет двусмысленности.
В любом случае , как указывает @Caleth, согласно 16.5.4.2.1.6 , этот код имеет неопределенное поведение.
1 Ссылка на C ++ содержит неверный абзац стандарта C ++.[over.over] на самом деле 12.4.