Поскольку разделы [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 ответ
/6 не отвечает за «звонок» /7; он просто иногда фильтрует свои входные данные, применяя определенные преобразования к операндам (а также в некоторых случаях отображая выражение в неправильном формате). Нам не понадобилось бы «вместо исходных операндов для оставшейся части этого раздела», если бы мы не собирались переходить к /7 в противном случае.
b?'c':a
?
otherwise
будет работать, процесс поэтапный, и в соответствии с этими условиями в предыдущих абзацах они false
, за исключением предложения 6, однако оно определяет только категорию значения результата выражения условия, тип результата не был определен? Похоже, что предложение 7 определяет, но поскольку часть Interpretation
, только условие в предложении 6 истинно, тогда будет выполнено предложение 7, однако условие ложно, это мой вопрос.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
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 } }
true?'c':a
не относится к случаям, описанным в предыдущих абзацах, значит, это случай предложения 6, потому чтоOtherwise
в предложении 6