Операторы выбора выбирают один из нескольких потоков управления.
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-statement — end note [stmt.stmt]substatement statementstatements selection-statementelse if block scopecompound-statement Example:
if (x) int i;
можно эквивалентно переписать как
if (x) { int i; }
Таким образом, послеif заявления,i больше не входит в сферу действия. ] — end example
Если условие ([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.
Вswitch заявлении причины управления должны быть переданы одному из нескольких операторов в зависимости от значения условия.
Условие должно быть целочисленного типа, типа перечисления или типа класса. Если тип класса, условие относитсяcontextually implicitly converted к целочисленному или перечислимому типу. Если тип (возможно, преобразованный) подлежитintegral promotions, условие преобразуется в повышенный тип. Любой оператор внутриswitch оператора может быть помечен одной или несколькими метками case, как показано ниже:
case constant-expression :
где constant-expressionдолжно быть преобразованиемconstant expression настроенного типа состояния переключения. Никакие две константы case в одном переключателе не должны иметь одинаковое значение после преобразования.
Операторы переключения могут быть вложенными;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.