2013-08-18 21 views
6

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?

+3

La seconda versione è SFINAE-d di sovraccarico di impostare se non tutti 'UTypes' sono implicitamente convertibile corrispondente' Types' – jrok

risposta

10

Ecco un esempio semplificato:

template <typename T> 
struct foo 
{ 
    foo(const T&); 
    template <typename U> 
    foo(U&&); 
}; 

Il secondo costruttore richiede un qualche tipo di tipo di modello deduzione. Questo non funziona in tutti i casi, ad es. con gli elenchi di inizializzatori. La seguente inizializzazione funziona solo se il primo costruttore è disponibile:

auto f = foo<std::vector<int>>{ { 1, 2, 3 } }; 
0

Questo è per l'inoltro riferimento rvalue, ed è ottimizzato per la costruzione mossa. La prima versione è utilizzata per lvalue. Vedi il seguente link per spiegare meglio.

http://thbecker.net/articles/rvalue_references/section_07.html

+4

La seconda versione può essere utilizzato per i riferimenti rvalue così come per i riferimenti lvalue. – nosid

+0

Concordato, ma il compilatore farà la scelta migliore in fase di compilazione per la firma della funzione e in questo caso hanno 2 firme fornite. Sono d'accordo con la tua risposta così come aiuta con la deduzione del modello ed è richiesto per quel motivo. – bjackfly

Problemi correlati