6.7 KiB
[stmt.if]
8 Statements [stmt]
8.5 Selection statements [stmt.select]
8.5.2 The if statement [stmt.if]
If the condition ([stmt.pre]) yields true, the first substatement is executed.
If the else part of the selection statement is present and the condition yields false, the second substatement is executed.
If the first substatement is reached via a label, the condition is not evaluated and the second substatement is not executed.
In the second form of if statement (the one including else), if the first substatement is also anif statement then that inner if statement shall contain an else part.72
If the if statement is of the form if constexpr, the value of the condition is contextually converted to bool and the converted expression shall be a constant expression ([expr.const]); this form is called a constexpr if statement.
If the value of the converted condition is false, the first substatement is adiscarded statement, otherwise the second substatement, if present, is a discarded statement.
During the instantiation of an enclosing templated entity ([temp.pre]), if the condition is not value-dependent after its instantiation, the discarded substatement (if any) is not instantiated.
Each substatement of a constexpr if statement is a control-flow-limited statement ([stmt.label]).
[Example 1: if constexpr (sizeof(int[2])) {} // OK, narrowing allowed â end example]
[Note 1:
Odr-uses ([basic.def.odr]) in a discarded statement do not require an entity to be defined.
â end note]
[Example 2: template<typename T, typename ... Rest> void g(T&& p, Rest&& ...rs) {// ... handle pif constexpr (sizeof...(rs) > 0) g(rs...); // never instantiated with an empty argument list}extern int x; // no definition of x requiredint f() {if constexpr (true)return 0; else if (x)return x; elsereturn -x;} â end example]
An if statement of the form
if constexpropt ( init-statement condition ) statement
is equivalent to
{
init-statement
if constexpropt ( condition ) statement
}
and an if statement of the form
if constexpropt ( init-statement condition ) statement else statement
is equivalent to
{
init-statement
if constexpropt ( condition ) statement else statement
}
except that the init-statement is in the same scope as the condition.
An if statement of the form if consteval is called a consteval if statement.
The statement, if any, in a consteval if statement shall be a compound-statement.
[Example 3: constexpr void f(bool b) {if (true)if consteval { }else ; // error: not a compound-statement; else not associated with outer if} â end example]
If a consteval if statement is evaluated in a context that is manifestly constant-evaluated ([expr.const]), the first substatement is executed.
[Note 2:
The first substatement is an immediate function context.
â end note]
Otherwise, if the else part of the selection statement is present, then the second substatement is executed.
Each substatement of a consteval if statement is a control-flow-limited statement ([stmt.label]).
An if statement of the form
if ! consteval compound-statement
is not itself a consteval if statement, but is equivalent to the consteval if statement
if consteval { } else compound-statement
An if statement of the form
if ! consteval compound-statement1 else statement2
is not itself a consteval if statement, but is equivalent to the consteval if statement
if consteval statement2 else compound-statement1
In other words, the else is associated with the nearest un-elsedif.