9 Statements [stmt.stmt]

9.4 Selection statements [stmt.select]

Операторы выбора выбирают один из нескольких потоков управления.

selection-statement:
	if constexpropt ( init-statementopt condition ) statement
	if constexpropt ( init-statementopt condition ) statement else statement
	switch ( init-statementopt condition ) statement

См[dcl.meaning] для опциональных attribute-specifier-seqв состоянии. [ Заканчивается точкой с запятой. ] В разделе термин относится к содержащимся или появляющимся в нотации синтаксиса. Подложка в (каждая подгруппа в форме оператора) неявно определяет a . Если подзапрос в операторе выбора является единственным оператором, а не является , это как если бы оно было переписано как составное-выражение, содержащее исходное подзаголовок. [Note: init-statementend note[stmt.stmt]substatement statementstatements selection-statementelse if block scopecompound-statementExample:

if (x)
  int i;

можно эквивалентно переписать как

if (x) {
  int i;
}

Таким образом, послеif заявления,i больше не входит в сферу действия. ]end example

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 notecase 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.

9.4.2 The switch statement [stmt.switch]

Вswitch заявлении причины управления должны быть переданы одному из нескольких операторов в зависимости от значения условия.

Условие должно быть целочисленного типа, типа перечисления или типа класса. Если тип класса, условие относитсяcontextually implicitly converted к целочисленному или перечислимому типу. Если тип (возможно, преобразованный) подлежитintegral promotions, условие преобразуется в повышенный тип. Любой оператор внутриswitch оператора может быть помечен одной или несколькими метками case, как показано ниже:

case constant-expression :

где constant-expressionдолжно быть преобразованиемconstant expression настроенного типа состояния переключения. Никакие две константы case в одном переключателе не должны иметь одинаковое значение после преобразования.

Должно быть не более одной метки формы

default :

вswitch заявлении.

Операторы переключения могут быть вложенными;case илиdefault метка связана с наименьшим переключатель вмещающих его.

Когдаswitch оператор выполняется, его состояние оценивается и сравнивается с каждой константой case. Если одна из констант case равна значению условия, управление передается оператору, следующему за меткой сопоставленного case. Если ни одна константа регистра не соответствует условию и если есть default метка, управление передается оператору, помеченному меткой по умолчанию. Если ни один регистр не соответствует и если нет,default то ни один из операторов в переключателе не выполняется.

case иdefault сами по себе ярлыки не изменяют поток управления, который продолжается беспрепятственно через такие ярлыки. Чтобы выйти из переключателя, смbreak. [ Note: Обычно подоператор , что является предметом переключателя является соединением иcase иdefault этикетки появляются на показаниях верхнего уровня , содержащихся в (соединение) подоператор, но это не является обязательным. Объявления могут появляться в подзапросе switch утверждения. ]end note

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

switch ( init-statement condition ) statement

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

{
	init-statement
	switch ( condition ) statement
}

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