Поскольку разделы [expr.cond] слишком длинные, я приведу здесь только раздел 6 и часть раздела 7, другие разделы будут приведены по ссылке [expr.cond]
6. В противном случае результат является предварительным значением. Если второй и третий операнды не имеют одинаковый тип и оба имеют (возможно, cv-квалифицированный) тип класса, разрешение перегрузки используется для определения преобразований (если они есть), которые должны применяться к операндам ([over.match.oper ], [over.built]). Если не удается разрешить перегрузку, программа работает некорректно. В противном случае применяются определенные таким образом преобразования, а преобразованные операнды используются вместо исходных операндов в оставшейся части этого раздела.
7. Для второго и третьего операндов выполняются стандартные преобразования в значение-значение, массив-в-указатель и функцию-в-указатель. После этих преобразований должно выполняться одно из следующего:
7.1 Второй и третий операнды имеют одинаковый тип; результат этого типа, и объект результата инициализируется с использованием выбранного операнда.
7.2 Второй и третий операнды имеют арифметику c или тип перечисления; обычные арифметические c преобразования выполняются, чтобы привести их к общему типу, и результат этого типа.
Давайте рассмотрим следующую ситуацию:
#include <iostream>
int main(){
bool b = true;
int a = 0;
auto r = b?'c':a; //#1
}
Мы знаем, что выражение #1
не соответствует [expr.cond] / 2, [expr.cond] / 3, [expr.cond] / 4, [expr.cond] / 5, и мы знаем, что это случай [ expr.cond] / 6, Однако только условие Если второй и третий операнды не имеют одинаковый тип и имеют либо (возможно, cv-квалифицированный) тип класса, и разрешение перегрузки выполнено успешно удовлетворяется тогда секция 7 будет выполнена для операнда, как я прочитал секцию 6. Очевидно, что ни 'c'
, ни 'a'
не являются типом класса. Итак, мне интересно, продолжает ли секция 7 работать с этим операндом, особенно, раздел 7.2. Если я неправильно понимаю, как стандарт заставляет раздел 7 работать для случая #1
?
Интерпретация:
Мое понимание предложения 6, как если бы оно было:
if("the second and third operands do not have the same type, and either has (possibly cv-qualified) class type" == true){
if("the overload resolution fails"==true){
"the program is ill-formed"
}else{
"the converted operands are used in place of the original operands for the
remainder of this section" //that means sentence 7 will be performed
}
}