Originariamente inviato da shodan
Quello che mi lascia perplesso è:
codice:
 0 ? a : b
in questa definizione:
codice:
typedef typename cond<sizeof check(0 ? a : b, 0), A, B>::type
a rigor di logica, sia a compile time sia a run time il valore scelto sarà sempre b.
Il valore non interessa, è un trucco per sfruttare l'algoritmo di scelta del tipo restituito dall'operatore ternario, descritto a [expr.cond] ¶3 dello standard.
In base al tipo viene scelto l'appropriato overload di check, che a sua volta restituirebbe un array di dimensioni diverse a seconda dell'overload scelto. check in realtà non viene chiamato per davvero, dato che le espressioni dentro a sizeof non vengono valutate, ma se ne considera esclusivamente il tipo, e di fatto è tutto un trucco per ottenere il numero corrispondente a ciascun overload.
Questo numero è quindi dato in pasto a cond, che è specializzato esplicitamente per tutti quei numeri (tramite la macro CCASE), e che include in sé nel membro type il tipo che gli è fatto corrispondere nella CCASE.
Il trucco di identity credo sia necessario per forzare le funzioni a restituire un array di dimensioni fisse, cosa che normalmente credo non si potrebbe fare senza includerlo in una struct.