This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

169
cppdraft/conv/general.md Normal file
View File

@@ -0,0 +1,169 @@
[conv.general]
# 7 Expressions [[expr]](./#expr)
## 7.3 Standard conversions [[conv]](conv#general)
### 7.3.1 General [conv.general]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L503)
Standard conversions are implicit conversions with built-in meaning[.](#1.sentence-1)
[[conv]](conv "7.3Standard conversions") enumerates the full set of such conversions[.](#1.sentence-2)
A[*standard conversion sequence*](#def:conversion_sequence,standard "7.3.1General[conv.general]") is a sequence of standard
conversions in the following order:
- [(1.1)](#1.1)
Zero or one conversion from the following set: lvalue-to-rvalue
conversion, array-to-pointer conversion, and function-to-pointer
conversion[.](#1.1.sentence-1)
- [(1.2)](#1.2)
Zero or one conversion from the following set: integral
promotions, floating-point promotion, integral conversions, floating-point
conversions, floating-integral conversions, pointer conversions,
pointer-to-member conversions, and boolean conversions[.](#1.2.sentence-1)
- [(1.3)](#1.3)
Zero or one function pointer conversion[.](#1.3.sentence-1)
- [(1.4)](#1.4)
Zero or one qualification conversion[.](#1.4.sentence-1)
[*Note [1](#note-1)*:
A standard conversion sequence can be empty, i.e., it can consist of no
conversions[.](#1.sentence-4)
— *end note*]
A standard conversion sequence will be applied to
an expression if necessary to convert it to an expression having
a required destination type and value category[.](#1.sentence-5)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L533)
[*Note [2](#note-2)*:
Expressions with a given type will be implicitly converted to other
types in several contexts:
- [(2.1)](#2.1)
When used as operands of operators[.](#2.1.sentence-1)
The operator's requirements
for its operands dictate the destination type ([[expr.compound]](expr.compound "7.6Compound expressions"))[.](#2.1.sentence-2)
- [(2.2)](#2.2)
When used in the condition of an if statement ([[stmt.if]](stmt.if "8.5.2The if statement")) or
iteration statement ([[stmt.iter]](stmt.iter "8.6Iteration statements"))[.](#2.2.sentence-1)
The destination type isbool[.](#2.2.sentence-2)
- [(2.3)](#2.3)
When used in the expression of a switch statement ([[stmt.switch]](stmt.switch "8.5.3The switch statement"))[.](#2.3.sentence-1)
The destination type is integral[.](#2.3.sentence-2)
- [(2.4)](#2.4)
When used as the source expression for an initialization (which
includes use as an argument in a function call and use as the expression
in a return statement)[.](#2.4.sentence-1)
The type of the entity being initialized
is (generally) the destination type[.](#2.4.sentence-2)
See [[dcl.init]](dcl.init "9.5Initializers"), [[dcl.init.ref]](dcl.init.ref "9.5.4References")[.](#2.4.sentence-3)
— *end note*]
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L556)
An expression E can be[*implicitly converted*](#def:conversion,implicit "7.3.1General[conv.general]") to a type T if and only if the
declaration T t = E; is well-formed, for some invented temporary
variable t ([[dcl.init]](dcl.init "9.5Initializers"))[.](#3.sentence-1)
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L562)
Certain language constructs require that an expression be converted to a Boolean
value[.](#4.sentence-1)
An expression E appearing in such a context is said to be[*contextually converted to bool*](#def:conversion,contextual_to_bool "7.3.1General[conv.general]") and is well-formed if and only if
the declaration bool t(E); is well-formed, for some invented temporary
variable t ([[dcl.init]](dcl.init "9.5Initializers"))[.](#4.sentence-2)
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L569)
Certain language constructs require conversion to a value having
one of a specified set of types appropriate to the construct[.](#5.sentence-1)
An
expression E of class type C appearing in such a
context is said to be[*contextually implicitly converted*](#def:contextually_implicitly_converted "7.3.1General[conv.general]") to a specified type T and is
well-formed if and only if E can be implicitly converted to a type T that is determined as follows:C is searched for non-explicit conversion functions
whose return type is cv T or reference to cvT such that T is allowed by the context[.](#5.sentence-2)
There shall be exactly one such T[.](#5.sentence-3)
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L583)
The effect of any implicit
conversion is the same as performing the corresponding declaration and initialization
and then using the temporary variable as the result of the conversion[.](#6.sentence-1)
The result is an lvalue if T is an lvalue reference
type or an rvalue reference to function type ([[dcl.ref]](dcl.ref "9.3.4.3References")),
an xvalue if T is an rvalue reference to object type,
and a prvalue otherwise[.](#6.sentence-2)
The expression E is used as a glvalue if and only if the initialization uses it as a glvalue[.](#6.sentence-3)
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L593)
[*Note [3](#note-3)*:
For class types, user-defined conversions are considered as well;
see [[class.conv]](class.conv "11.4.8Conversions")[.](#7.sentence-1)
In general, an implicit conversion
sequence ([[over.best.ics]](over.best.ics "12.2.4.2Implicit conversion sequences")) consists of a standard conversion
sequence followed by a user-defined conversion followed by another
standard conversion sequence[.](#7.sentence-2)
— *end note*]
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L602)
[*Note [4](#note-4)*:
There are some contexts where certain conversions are suppressed[.](#8.sentence-1)
For
example, the lvalue-to-rvalue conversion is not done on the operand of
the unary & operator[.](#8.sentence-2)
Specific exceptions are given in the
descriptions of those operators and contexts[.](#8.sentence-3)
— *end note*]