General topics | ||||||||||||||||
Flow control | ||||||||||||||||
Conditional execution statements | ||||||||||||||||
Iteration statements (loops) | ||||||||||||||||
Jump statements | ||||||||||||||||
Functions | ||||||||||||||||
Function declaration | ||||||||||||||||
Lambda function expression | ||||||||||||||||
inline specifier | ||||||||||||||||
Dynamic exception specifications(until C++17*) | ||||||||||||||||
noexcept specifier(C++11) | ||||||||||||||||
Exceptions | ||||||||||||||||
Namespaces | ||||||||||||||||
Types | ||||||||||||||||
Specifiers | ||||||||||||||||
| ||||||||||||||||
Storage duration specifiers | ||||||||||||||||
Initialization | ||||||||||||||||
Expressions | ||||||||||||||||
Alternative representations | ||||||||||||||||
Literals | ||||||||||||||||
Boolean -Integer -Floating-point | ||||||||||||||||
Character -String -nullptr(C++11) | ||||||||||||||||
User-defined(C++11) | ||||||||||||||||
Utilities | ||||||||||||||||
Attributes(C++11) | ||||||||||||||||
Types | ||||||||||||||||
typedef declaration | ||||||||||||||||
Type alias declaration(C++11) | ||||||||||||||||
Casts | ||||||||||||||||
Memory allocation | ||||||||||||||||
Classes | ||||||||||||||||
Class-specific function properties | ||||||||||||||||
| ||||||||||||||||
Special member functions | ||||||||||||||||
Templates | ||||||||||||||||
Miscellaneous | ||||||||||||||||
General | ||||
Literals | ||||
Operators | ||||
Conversions | ||||
An expression is a sequence ofoperators and theiroperands, that specifies a computation.
Expression evaluation may produce a result (e.g., evaluation of2+2 produces the result4) and may generate side-effects (e.g. evaluation ofstd::printf("%d",4) prints the character'4' on the standard output).
Each C++ expression is characterized by two independent properties: A type and a value category.
Contents |
Common operators | ||||||
---|---|---|---|---|---|---|
assignment | increment decrement | arithmetic | logical | comparison | member access | other |
a= b | ++a | +a | !a | a== b | a[...] | function call a(...) |
comma a, b | ||||||
conditional a? b: c | ||||||
Special operators | ||||||
static_cast converts one type to another related type |
const_cast
conversionstatic_cast
conversiondynamic_cast
conversionreinterpret_cast
conversionsizeof
alignof
typeid
The operands of any operator may be other expressions or primary expressions (e.g. in1+2*3, the operands of operator+ are thesubexpression2*3 and the primary expression1).
Primary expressions are any of the following:
this
(since C++26) |
(since C++11) | |
(since C++17) | |
(since C++20) |
Any expression in parentheses is also classified as a primary expression: this guarantees that the parentheses have higher precedence than any operator. Parentheses preserve value, type, and value category.
Literals are the tokens of a C++ program that represent constant values embedded in the source code.
| (since C++11) |
| (since C++20) |
| (since C++11) |
| (since C++20) |
| (since C++11) |
Aconstituent expression is defined as follows:
=
are the constituent expressions of theinitializer-clause.int num1=0;num1+=1;// Case 1: the constituent expression of “num += 1” is “num += 1” int arr2[2]={2,22}// Case 2: the constituent expressions// of “{2, 22}” are “2” and “22”// Case 3: the constituent expressions of “= {2, 22}”// are the constituent expressions of “{2, 22}”// (i.e. also “2” and “22”)
Theimmediate subexpressions of an expressionE are
| (since C++14) |
| (since C++11) |
Asubexpression of an expressionE is an immediate subexpression ofE or a subexpression of an immediate subexpression ofE.Note that expressions appearing in the “function body” of lambda expressions are not subexpressions of the lambda expression.(since C++11)
The following expressions arefull-expressions :
(since C++20) |
| (since C++26) |
If a language construct is defined to produce an implicit call of a function, a use of the language construct is considered to be an expression for the purposes of this definition. Conversions applied to the result of an expression in order to satisfy the requirements of the language construct in which the expression appears are also considered to be part of the full-expression.
For an initializer, performing the initialization of the entity(including evaluating default member initializers of an aggregate)(since C++14) is also considered part of the full-expression.
An expression ispotentially evaluated unless
| (until C++11) | ||
The following operands areunevaluated operands, they are not evaluated:
An expression ispotentially evaluated unless
| (since C++11) |
Potentially-evaluated expressions areODR-use.
This section is incomplete Reason: example of unevaluated operands |
Adiscarded-value expression is an expression that is used for its side-effects only. The value calculated from such expression is discarded. Such expressions include the full-expression of anyexpression statement, the left-hand operand of the built-in comma operator, or the operand of a cast-expression that casts to the typevoid.
Array-to-pointer and function-to-pointer conversions are never applied to the value calculated by a discarded-value expression. The lvalue-to-rvalue conversion is applied if and only if the expression is avolatile-qualified glvalue and has one of the following forms (built-in meaning required, possibly parenthesized):
In addition, if the lvalue is of volatile-qualified class type, a volatile copy constructor is required to initialize the resulting rvalue temporary.
If the expression is a non-void prvalue (after any lvalue-to-rvalue conversion that might have taken place),temporary materialization occurs. Compilers may issue warnings when an expression other than cast tovoid discards a value declared | (since C++17) |
Expression-equivalenceA number of expressionse1,e2, ...,eN areexpression-equivalent if all following conditions are satisfied:
e1 isexpression-equivalent toe2 if and only ife1 ande2 are expression-equivalent (which meanse2 is also expression-equivalent toe1). | (since C++20) |
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 1054 | C++98 | assigning a value to a volatile variable might result in an unnecessary read due to the lvalue-to- rvalue conversion applied to the assignment result | introduce discarded-value expressions and exclude this case from the list of cases that require the conversion |
CWG 1343 | C++98 | sequencing of destructor calls in aggregate initialization was underspecified | full-expressions in aggregate initialization are well-specified |
CWG 1383 | C++98 | the list of expressions where lvalue-to-rvalue conversion is applied to discarded-value expressions also covered overloaded operators | only cover operators with built-in meaning |
CWG 1576 | C++11 | lvalue-to-rvalue conversions were not applied to discarded-value volatile xvalue expressions | apply the conversion in this case |
CWG 2249 | C++98 | identifiers to be declared in declarators were not id-expressions | they are |
CWG 2431 | C++11 | the invocations of the destructors of temporaries that are bound to references were not full-expressions | they are |
C documentation forExpressions |