Vorgegebene Typen A,B
, ich bin besorgt mit der genauen Definition von std::common_type<A,B>
, abgesehen von der Variadic Fall std::common_type<A...>
für beliebige Typen A...
. So lassensollte std :: common_type std :: zerfallen?
using T = decltype(true ? std::declval<A>() : std::declval<B>());
using C = std::common_type<A,B>;
nun nach einer Reihe von Quellen, ich habe die folgenden Beziehungen (Überspringen typename
der Kürze halber) gefunden:
cppreference.com:
C::type = std::decay<T>::type
cplusplus.com:
C::type = T
GCC 4.8.1
<type_traits>
implementierung n:C::type = std::decay<T>::type
wennT
gültig ist, sonstC
kein::type
Mitglied enthält ("SFINAE freundlich")Clang 3.3
<type_traits>
Umsetzung:C::type = std::remove_reference<T>::type
Ich finde die "SFINAE freundliche" Version von GCC ein kleines Detail, während std::remove_reference
und std::decay
praktisch nur in integrierten Arrays und Funktionen, plus cv-Qualifikation unterscheiden, für die ich wieder nicht viel betroffen bin. Also meine Frage ist
Sollte es decay<T>::type
oder nur T
sein? Was ist der Grund für die Verwendung von decay<T>::type
? Ist es nur ungefähr das Ergebnis A() + B()
darzustellen, z.B. für arithmetische Ausdrücke?
Zum Beispiel eines wenig experimentiert, habe ich festgestellt, dass im Fall der „just T
“ Definition, wir
common_type<int&,int&> = int&
common_type<int&,long&> = long
haben, ist, eine L-Wert Referenz beibehalten wird, wenn Typen gleich sind . Dies spiegelt die Tatsache wider, dass
int a, b;
(true ? a : b) = 0;
gültig ist, während
int a;
long b;
(true ? a : b) = 0;
nicht. Diese Semantik von "Zuweisung zulassen, wenn Typen gleich sind" ist genau das, was ich in einer Anwendung benötige, und ich glaube, dass common_type
und decay
zwei unabhängige Schritte sein sollten. Soll ich nur meine eigenen Definitionen verwenden?
'' und remove_reference' decay' auch für Referenztypen in der CV-Qualifikation unterscheiden hinzuzufügen ergibt; 'std :: declval ' gibt eine rvalue-Referenz zurück. – dyp
'T' ist alt (C++ 11),' Zerfall 'ist neu (C++ 1y), es ist wahrscheinlich ein Defekt im Zusammenhang damit. Lass mich sehen .. –
dyp
@dyp Ja, ich war nicht so vorsichtig dort, deshalb schrieb ich "praktisch", ich werde reparieren. – iavr