This non-normative note in the standard is intended to motivate the concept of expression, but is not an actual definition. The definition of an expression is given in the grammar of the language, which is given in the rest of paragraph 5. The expressions are constructed from certain terminals, such as literals, variable names, and function names, which are combined using operators such as arithmetic and relational operators.
Declarations and expressions are various syntactic entities, therefore an ad found inside a C ++ program is never an expression, and vice versa. The difference is pretty easy to see at a glance: if she announces something, this is an announcement.
1;
An ad may evaluate expressions, but a declaration is not an expression. You rightly point out that declaring an object of type class can cause a constructor call. However, this is a syntax declaration, not an expression.
However, there is another point in which the declaration is an expression. Namely, the rules on the sequence of evaluations in expressions also apply to declarations. For example, there is a rule that the side effect of incrementing a postfix on an int occurs at some point before the end of the full expression.
f(i++) + g(); // i may be incremented before or after g() is called... h(); // but definitely before h() is called.
For the purpose of such rules, declaring and initializing one variable is also considered a complete expression. In the case of a class type variable, a constructor call is part of this expression.
int i = 1; // this declaration evaluates a full-expression // whose effect is to initialize `i` to 1 int j = f(i++) + g(), k = h(); // two separate full-expressions; // i is incremented before h() is called
When reading the standard, you need to consider the context to understand what the term “expression” means.