некоторые недоразумения по поводу выражения [expr.cond # 6] - PullRequest
1 голос
/ 20 апреля 2020

Поскольку разделы [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
   }
}

1 Ответ

2 голосов
/ 20 апреля 2020

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

...