std::tuple
contiene, tra gli altri, i seguenti costruttori:Sono necessari tutti i costruttori di tupla std ::?
explicit tuple(const Types&... args);
template< class... UTypes >
explicit tuple(UTypes&&... args);
Entrambi hanno descrizioni equivalenti in quanto inizializzare ognuno degli elementi con il corrispondente valore in args
. L'unica differenza è che nel secondo i parametri vengono inoltrati.
Da quello che ho capito sui riferimenti di rvalue, non vedo perché è richiesta la prima versione poiché gli stessi parametri potrebbero essere passati alla seconda versione. I riferimenti sarebbero stati inoltrati e nessuno sarebbe più saggio, soprattutto perché non c'è menzione della semantica del movimento.
Qualcuno può spiegare che cosa rende necessari entrambi i costruttori?
La seconda versione è SFINAE-d di sovraccarico di impostare se non tutti 'UTypes' sono implicitamente convertibile corrispondente' Types' – jrok