9 Statements [stmt.stmt]

9.4 Selection statements [stmt.select]

9.4.1 The if statement [stmt.if]

Если условие ([stmt.select]) приводит true к выполнению первого подзапуска. Если else часть оператора выбора присутствует и условие дает результат false, выполняется второе подзапрос. Если первая подгруппа достигается через метку, условие не оценивается, и вторая подгруппа не выполняется. Во второй форме if утверждения (включая ту, которая включает в себя else), если первое подзаполнение также является if утверждением, то это внутреннее if утверждение должно содержать else часть.90

Если if заявление имеет форму if constexpr, значение условия должно быть a contextually converted constant expression of type bool; эта форма называется constexpr if заявлением. Если значение преобразованного условия равно false, первая подгруппа - это a discarded statement, в противном случае вторая подгруппа, если она присутствует, является отвергнутым оператором. Во время создания включающего templated объекта, если условие не зависит от значения после его создания, отброшенное подзаполнение (если оно есть) не создается. [ Note: Odr-uses в отвергнутом заявлении не требуют определения сущности. ] Знак или метка, появляющаяся в таком операторе, должны быть связаны с элементом в том же операторе. A, объявленный в подвыложении constexpr if, должен ссылаться только на a в том же подзапросе. [end note case default if switch statement if label statement Example:

template<typename T, typename ... Rest> void g(T&& p, Rest&& ...rs) {
  // ... handle p

  if constexpr (sizeof...(rs) > 0)
    g(rs...);       // never instantiated with an empty argument list
}

extern int x;       // no definition of x required

int f() {
  if constexpr (true)
    return 0;
  else if (x)
    return x;
  else
    return -x;
}

end example]

if Утверждение вида

if constexpropt ( init-statement condition ) statement

эквивалентно

{
	init-statement
	if constexpropt ( condition ) statement
}

и if выписка по форме

if constexpropt ( init-statement condition ) statement else statement

эквивалентно

{
	init-statement
	if constexpropt ( condition ) statement else statement
}

за исключением того, что имена, объявленные в, init-statementнаходятся в той же декларативной области, что и имена, объявленные в condition.

Другими словами, else связан с ближайшим не-elsed if.