Die Vorlagenklasse std::common_type
berechnet einen allgemeinen Typ für eine Variantentypliste. It is defined using the return type of the ternary operator x:y?z
recursively. Aus dieser Definition ist es für mich nicht offensichtlich, ob die Berechnung einer std::common_type<X,Y>
ist assoziativ, i. e. obIst `std :: common_type` assoziativ?
using namespace std;
static_assert(is_same<common_type< X, common_type<Y,Z>::type >::type,
common_type< common_type<X,Y>::type, Z >::type>::value, "");
wird nie ein Fehler bei der Kompilierung für alle Arten X
, Y
und Z
für die werfen die is_same<...>
Ausdruck gültig ist.
Bitte beachten Sie, dass ich, ob
static_assert(is_same<common_type<X,Y>::type,
common_type<Y,X>::type>::value, "");
wird jemals Feuer NICHT bin gefragt. Es wird offensichtlich nicht. Das Obige ist eine ganz andere Frage.
Bitte beachten Sie auch, dass die Spezifikation std::common_type
in C++ 14 leicht geändert wurde und sich wahrscheinlich in C++ 17 wieder ändert. Daher können die Antworten für verschiedene Versionen des Standards unterschiedlich sein.
Akzeptieren Sie einen Fall, in dem '(X, (Y, Z))' 'einen gemeinsamen Typ hat, aber' (X, Y) 'und daher' (X, Y), Z' nicht? Oder möchten Sie, dass beide zu einem Typ aufgelöst werden, aber andere? Denn ich stehe fest dabei, einen Fall für Letzteres zu konstruieren, und achte stark darauf, dass es nicht möglich ist; Zwei beliebige Konvertierungsketten verursachen eine Mehrdeutigkeit. – BoBTFish
Es ist sicherlich der Fall, dass die static_assertion nicht kompilieren kann, da es keinen gemeinsamen Typ gibt. Ich nehme an, dass die Frage nach dem Fall fragt, in dem alle 'common_type' Typen gültig sind, aber' is_same' ist falsch. –
@ JonathanWakely Danke für den Hinweis. Die Frage wurde korrigiert. –