std:: common_reference
|
Definiert im Header
<type_traits>
|
||
|
template
<
class
...
T
>
struct common_reference ; |
(seit C++20) | |
Bestimmt den gemeinsamen Referenztyp der Typen
T...
, also den Typ, zu dem alle Typen in
T...
konvertiert oder gebunden werden können. Falls ein solcher Typ existiert (gemäß den nachfolgenden Regeln bestimmt), benennt das Mitglied
type
diesen Typ. Andernfalls existiert kein Mitglied
type
. Das Verhalten ist undefiniert, falls einer der Typen in
T...
ein unvollständiger Typ ist, außer (möglicherweise cv-qualifiziertem)
void
.
Wenn Referenztypen gegeben sind,
common_reference
versucht, einen Referenztyp zu finden, an den die gelieferten Referenztypen alle gebunden werden können, kann aber einen Nicht-Referenztyp zurückgeben, falls es keinen solchen Referenztyp finden kann.
-
Wenn
sizeof...
(
T
)
null ist, existiert kein Member
type. -
Wenn
sizeof...
(
T
)
eins beträgt (d.h.
T...enthält nur einen TypT0), bezeichnet der Membertypedenselben Typ wie T0 . -
Wenn
sizeof...
(
T
)
zwei beträgt (d.h.
T...enthält zwei TypenT1undT2):-
Sei Typ
Sder einfache gemeinsame Referenztyp vonT1undT2(wie unten definiert). Der Member-TyptypebezeichnetS, wenn alle folgenden Bedingungen erfüllt sind:-
T1undT2sind beide Referenztypen -
Sist wohlgeformt
-
-
Sei Typ
|
(seit C++23) |
-
-
Andernfalls, falls
std
::
basic_common_reference
<
std::
remove_cvref_t
<
T1
>
,
std::
remove_cvref_t
<
T2
>
, T1Q, T2Q
>
::
type
existiert, wobei
TiQein unäres Alias-Template ist, sodass TiQ < U >Umit den zusätzlichen CV- und Referenzqualifizierern vonTiist, dann benennt der Member-Typtypediesen Typ;
-
Andernfalls, falls
std
::
basic_common_reference
<
std::
remove_cvref_t
<
T1
>
,
std::
remove_cvref_t
<
T2
>
, T1Q, T2Q
>
::
type
existiert, wobei
-
-
Andernfalls, falls
decltype
(
false
?
val
<
T1
>
(
)
:
val
<
T2
>
(
)
)
, wobei
valein Funktions-Template template < class T > T val ( ) ; ist, ein gültiger Typ ist, dann bezeichnet der Member-Typtypediesen Typ; -
Andernfalls, falls
std::
common_type_t
<
T1, T2
>
ein gültiger Typ ist, dann bezeichnet der Member-Typ
typediesen Typ; -
Andernfalls existiert kein Member
type.
-
Andernfalls, falls
decltype
(
false
?
val
<
T1
>
(
)
:
val
<
T2
>
(
)
)
, wobei
-
Falls
sizeof...
(
T
)
größer als zwei ist (d.h.,
T...besteht aus den TypenT1, T2, R...), dann bezeichnet der Membertypestd :: common_reference_t < std :: common_reference_t < T1, T2 > , R... > , falls ein solcher Typ existiert. In allen anderen Fällen existiert kein Membertype.
Der
einfache gemeinsame Referenztyp
von zwei Referenztypen
T1
und
T2
wird wie folgt definiert:
-
Wenn
T1cv1 X&undT2cv2 Y&ist (d.h. beide sind Lvalue-Referenztypen): ihr einfacher gemeinsamer Referenztyp ist decltype ( false ? std:: declval < cv12 X & > ( ) : std:: declval < cv12 Y & > ( ) ) , wobei cv12 die Vereinigung von cv1 und cv2 ist, falls dieser Typ existiert und ein Referenztyp ist; -
Wenn
T1undT2beide Rvalue-Referenztypen sind: falls der einfache gemeinsame Referenztyp vonT1&undT2&(bestimmt gemäß vorherigem Punkt) existiert, dann seiCder entsprechende Rvalue-Referenztyp dieses Typs. Wenn std:: is_convertible_v < T1, C > und std:: is_convertible_v < T2, C > beide true sind, dann ist der einfache gemeinsame Referenztyp vonT1undT2C; -
Andernfalls muss einer der beiden Typen ein Lvalue-Referenztyp
A&und der andere ein Rvalue-ReferenztypB&&sein (AundBkönnten CV-qualifiziert sein). SeiDder einfache gemeinsame Referenztyp von A & und B const & , falls vorhanden. Wenn D existiert und std:: is_convertible_v < B && , D > true ist, dann ist der einfache gemeinsame ReferenztypD; - Andernfalls gibt es keinen einfachen gemeinsamen Referenztyp.
Siehe Bedingter Operator für die Definition des Typs von Ausdrücken false ? X : Y wie die oben verwendeten.
Inhaltsverzeichnis |
Mitgliedertypen
| Name | Definition |
type
|
der gemeinsame Referenztyp für alle
T...
|
Hilfstypen
|
template
<
class
...
T
>
using common_reference_t = std :: common_reference < T... > :: type ; |
||
|
template
<
class
T,
class
U,
template
<
class
>
class
TQual,
template
<
class
>
class
UQual
>
struct basic_common_reference { } ; |
||
Die Klassenvorlage
basic_common_reference
ist ein Anpassungspunkt, der es Benutzern ermöglicht, das Ergebnis von
common_reference
für benutzerdefinierte Typen (typischerweise Proxy-Referenzen) zu beeinflussen. Die primäre Vorlage ist leer.
Spezialisierungen
Ein Programm kann
std
::
basic_common_reference
<
T, U, TQual, UQual
>
für die ersten beiden Parameter
T
und
U
spezialisieren, falls
std::
is_same_v
<
T,
std::
decay_t
<
T
>>
und
std::
is_same_v
<
U,
std::
decay_t
<
U
>>
beide
true
sind und mindestens einer von ihnen von einem programmdefinierten Typ abhängt.
Falls eine solche Spezialisierung ein Mitglied namens
type
besitzt, muss es ein öffentliches und eindeutiges Mitglied sein, das einen Typ benennt, in den sowohl
TQual
<
T
>
als auch
UQual
<
U
>
konvertierbar sind. Zusätzlich müssen
std
::
basic_common_reference
<
T, U, TQual, UQual
>
::
type
und
std
::
basic_common_reference
<
U, T, UQual, TQual
>
::
type
denselben Typ bezeichnen.
Ein Programm darf
basic_common_reference
nicht für den dritten oder vierten Parameter spezialisieren, noch darf es
common_reference
selbst spezialisieren. Ein Programm, das Spezialisierungen entgegen diesen Regeln hinzufügt, hat undefiniertes Verhalten.
Die Standardbibliothek bietet folgende Spezialisierungen von
basic_common_reference
an:
bestimmt den gemeinsamen Referenztyp zweier
pair
s
(Klassen-Template-Spezialisierung) |
|
bestimmt den gemeinsamen Referenztyp eines
tuple
und eines
tuple-like
Typs
(Klassen-Template-Spezialisierung) |
|
bestimmt den gemeinsamen Referenztyp von
reference_wrapper
und Nicht-
reference_wrapper
(Klassen-Template-Spezialisierung) |
Hinweise
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_common_reference
|
202302L
|
(C++23) | Mache std::common_reference_t von std::reference_wrapper zu einem Referenztyp |
Beispiele
#include <concepts> #include <type_traits> static_assert( std::same_as< int&, std::common_reference_t< std::add_lvalue_reference_t<int>, std::add_lvalue_reference_t<int>&, std::add_lvalue_reference_t<int>&&, std::add_lvalue_reference_t<int>const, std::add_lvalue_reference_t<int>const& > > ); int main() {}
Siehe auch
|
(C++11)
|
bestimmt den gemeinsamen Typ einer Gruppe von Typen
(Klassen-Template) |
|
(C++20)
|
spezifiziert, dass zwei Typen einen gemeinsamen Referenztyp teilen
(Konzept) |