2012-12-22 20 views
52

Ho trovato il codice here che sembrava qualcosa di simile:Cosa fa il 'void()' in 'auto f (params) -> decltype (..., void())'?

auto f(T& t, size_t n) -> decltype(t.reserve(n), void()) { .. } 

In tutta la documentazione che ho letto mi è stato detto che decltype è firmato come:

decltype(entity)

o

decltype(expression)

E non c'è nessun secondo argomento da nessuna parte. Almeno questo è ciò che è indicato su cppreference. Si tratta di un secondo argomento a decltype? E se sì, cosa fa?

risposta

71

Poiché è un'espressione quella virgola è semplicemente l'operatore virgola (ovvero il tipo è il tipo di lato rhs: void), non un altro argomento.

Quel codice sta utilizzando SFINAE - è abilitato se t.reserve(n) esiste ma vuole mantenere il tipo di ritorno come void.

+0

Non avrei mai immaginato. Grazie. –

+5

@templateboy: l'operatore virgola si trova sempre nei posti più inaspettati;) –

+9

OMG abbiamo seriamente bisogno di costrutti linguistici per non dover scrivere tali trucchi hacky! O__O ;;; – Klaim

Problemi correlati