Files
cppdraft_translate/cppdraft/conv/general.md
2025-10-25 03:02:53 +03:00

170 lines
6.3 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[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*]