Поскольку разделы [expr.cond] слишком длинные, я привожу здесь только раздел 6 и часть раздела 7, остальные разделы будут даны по ссылке [expr.cond]

6. В противном случае результатом будет значение prvalue. Если второй и третий операнды не имеют одного и того же типа, и один из них имеет тип класса (возможно, cv-qualified), разрешение перегрузки используется для определения преобразований (если таковые имеются), которые должны быть применены к операндам ([over.match.oper ], [надстроен]). Если разрешение перегрузки не удается, программа имеет неправильный формат. В противном случае применяются определенные таким образом преобразования, и преобразованные операнды используются вместо исходных операндов в оставшейся части этого раздела.

7. Стандартные преобразования Lvalue-to-rvalue, массива в указатель и функции в указатель выполняются для второго и третьего операндов. После этих преобразований должно выполняться одно из следующих условий:
7.1 Второй и третий операнды имеют одинаковый тип; результат имеет этот тип, и объект результата инициализируется с использованием выбранного операнда.
7.2 Второй и третий операнды имеют арифметический или перечислительный тип; обычные арифметические преобразования выполняются, чтобы привести их к общему типу, и результат имеет этот тип.

Рассмотрим следующую ситуацию:

#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, и мы знаем, что это так of [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
   }
}
1
xmh0511 20 Апр 2020 в 05:30
Почему вы решили, что 7 не применяется, если операнды не относятся к классу?
 – 
Language Lawyer
20 Апр 2020 в 06:30
Потому что предложение после *if является условием, если условие не выполняется. Я думаю, что предложение после условия не выполняется.
 – 
xmh0511
20 Апр 2020 в 06:31
Другими словами, мое понимание предложения 6 выглядит так: if("second and third operands do not have the same type, and either has (possibly cv-qualified) class type"){ if("overload resolution fails"){ the program is ill-formed }else{ the converted operands are used in place of the original operands for the remainder of this section } }
 – 
xmh0511
20 Апр 2020 в 06:33
Ваше понимание кажется мне правильным. Я не понимаю, почему ложные условия «ЕСЛИ» в предыдущих абзацах не помешали вам читать дальше, а условие в шестом абзаце каким-то образом мешает вам перейти к седьмому абзацу.
 – 
Language Lawyer
20 Апр 2020 в 06:39
Поскольку true?'c':a не относится к случаям, описанным в предыдущих абзацах, значит, это случай предложения 6, потому что Otherwise в предложении 6
 – 
xmh0511
20 Апр 2020 в 06:43

1 ответ

/6 не отвечает за «звонок» /7; он просто иногда фильтрует свои входные данные, применяя определенные преобразования к операндам (а также в некоторых случаях отображая выражение в неправильном формате). Нам не понадобилось бы «вместо исходных операндов для оставшейся части этого раздела», если бы мы не собирались переходить к /7 в противном случае.

2
Davis Herring 20 Апр 2020 в 08:40
Если /7 не выполняется для этих операндов в примере, который я написал, как определить тип результата? Или, другими словами, означает ли это, что правило остановилось на /6, а /7 никогда не будет выполняться на b?'c':a?
 – 
xmh0511
20 Апр 2020 в 09:01
@jackX: Это снова твой вопрос, на который я уже ответил.
 – 
Davis Herring
20 Апр 2020 в 10:34
Я не понимаю, что вы имеете в виду, когда или в какой ситуации, по вашему мнению, /7 будет выступать?
 – 
xmh0511
20 Апр 2020 в 10:44
Я думаю, что от предложения 2 до предложения 6, если условие не выполняется, то otherwise будет работать, процесс поэтапный, и в соответствии с этими условиями в предыдущих абзацах они false, за исключением предложения 6, однако оно определяет только категорию значения результата выражения условия, тип результата не был определен? Похоже, что предложение 7 определяет, но поскольку часть Interpretation, только условие в предложении 6 истинно, тогда будет выполнено предложение 7, однако условие ложно, это мой вопрос.
 – 
xmh0511
20 Апр 2020 в 10:54
1
@jackX: /7 применяется именно тогда, когда ни /2, ни /5 не применяются (и ни /4, ни /6 не отклонили выражение).
 – 
Davis Herring
20 Апр 2020 в 10:55