Szablon klasy std::common_type
oblicza wspólny typ dla listy typu variadic. It is defined using the return type of the ternary operator x:y?z
recursively. Z tej definicji nie jest dla mnie oczywiste, czy obliczanie std::common_type<X,Y>
jest asocjacyjne, tj. mi. czyCzy stowarzyszenie ma postać "std :: typ_typowy"?
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, "");
nigdy nie będzie rzucać się błąd kompilacji dla wszystkich typów X
, Y
i Z
dla którego ekspresja is_same<...>
jest prawidłowy.
Należy pamiętać, że nie jestem z pytaniem, czy
static_assert(is_same<common_type<X,Y>::type,
common_type<Y,X>::type>::value, "");
nigdy ogień. Oczywiście nie. Powyższe jest zupełnie inne pytanie.
Należy również zauważyć, że specyfikacja std::common_type
zmieniła się nieznacznie w C++ 14 i prawdopodobnie zmieni się ponownie w C++ 17. Odpowiedzi mogą być różne dla różnych wersji standardu.
Czy zaakceptujesz przypadek, w którym '(X, (Y, Z)) ma typ wspólny, ale' (X, Y) ', a zatem' (X, Y), Z', nie? A może chcesz, aby oboje zdecydowali się na typ, ale inni. Ponieważ utknąłem, próbując skonstruować dla niego przypadek i mocno podejrzewam, że nie jest to możliwe; jakiekolwiek dwa łańcuchy konwersji spowodują dwuznaczność. – BoBTFish
Z pewnością przypadek, w którym static_sersertion nie może się skompilować, ponieważ nie ma wspólnego. Zakładam, że pytanie dotyczy pytania, w którym wszystkie typy 'typ_typu' są poprawne, ale' nazwa_systemu' jest fałszywa. –
@ JonathanWakely Dzięki za podpowiedź. Naprawiono pytanie. –