2015-09-03 7 views
6

Sto guardando il discorso Modern Template Metaprogramming di Walter E. Brown. Al 54:40 un codice è dato come di seguitorestituisce un valore senza dichiarazione di tipo return in template, si tratta di un refuso?

template<class T, T v> 
struct integral_constant{ 
    static constexpr T value = v; 
    constexpr operator T() const noexcept { return value; } // what does this mean? 
    constexpr T operator T() const noexcept { return value; } 
}; 

La mia domanda è che cosa significa questa linea constexpr operator T() const noexcept { return value; }, perché non v'è alcun tipo di ritorno ma è ancora tornando value? È un errore?

+3

Si tratta di una funzione di conversione. http://en.cppreference.com/w/cpp/language/cast_operator – 0x499602D2

+1

La seconda riga è in realtà 'constexpr T operator()() const noexcept {return value; } ', che è un operatore di chiamata di funzione. –

+0

Sì, hai ragione. Ho trascurato la diapositiva. – Allanqunzi

risposta

9

Sì, la seconda riga dell'operatore è errata e può essere eliminata completamente.

Un operatore di tipo come ad es. operator int() viene eseguito
quando l'oggetto viene colato o implicitamente convertito nel tipo:

MyClass myObject; 
int i = myObject; // here operator int() is used. 

Naturalmente, operator int() deve restituire int. Non è necessario o consentito scrivere un tipo di reso specifico per tali operatori. Nel tuo caso, non èdi float o qualcosa di specifico, ma il tipo di modello, ma è la stessa idea.

A parte il problema del tipo di ritorno, la seconda riga dell'operatore definisce nuovamente lo stesso operatore con gli stessi parametri, non possono esserci più funzioni con lo stesso nome e parametri.

E dopo l'intero struct, manca un punto e virgola.

Dopo fissazione di tali problemi, si compila: http://ideone.com/Hvrex5

+0

scusa, il punto e virgola di 'struct' è stato corretto. – Allanqunzi

+0

La seconda riga nel discorso è corretta. L'OP lo ha trascritto in modo errato. E si chiama "funzione di conversione", non un "operatore di tipo". –

+0

L'ho guardato ora, si. OP: Con la linea corretta, puoi tenere entrambi gli operatori, il primo è il tipo op come spiegato qui e il secondo è un op normale con tipo di ritorno come al solito. – deviantfan

3

Il primo non è un errore di battitura. Questa sintassi viene utilizzata per fornire la conversione da un oggetto della classe a un altro tipo.

Il tipo di ritorno è T

Vedi http://en.cppreference.com/w/cpp/language/cast_operator per maggiori informazioni.

Il qualificatore consexpr indica al compilatore che il valore restituito della funzione membro può essere determinato in fase di compilazione se l'oggetto su cui è stato chiamato è anche constexpr qualificato.

Il secondo non è una dichiarazione legale.

Problemi correlati