2014-05-01 13 views
6

gcc-4.8 accetta questo codice, ma non è sbagliato dal momento che il pacchetto di parametri non di tipo è equivalente a void... che è illegale?non è un pacchetto di parametri non di tipo che valuta "vuoto ..." illegale?

template <typename T, 
      typename std::enable_if<std::is_integral<T>::value>::type...> 
void test(T) {} 

Ho provato questo con clang-3.5 e che accetta anche. È un bug del compilatore o sto fraintendendo qualcosa?


Codice di prova completo di seguito, che utilizza i pacchetti di parametri vuoti non di tipo per semplificare enable_if. Questo è quasi lo stesso di Flaming Dangerzone's Remastered enable_if tranne che dopo la sostituzione il pacco diventa void....

#include <type_traits> 

template < typename C > 
using enable_if = typename std::enable_if<C::value>::type ; 

template < typename T, enable_if<std::is_integral<T>>... > 
void test(T){} // #1 

template < typename T, enable_if<std::is_floating_point<T>>... > 
void test(T){} //#2 

int main() 
{ 
    test(0); // calls #1 
    test(0.0); // calls #2 
    return 0; 
} 

gcc-4.8 compila il codice sopra bene. clang non lo fa ma perché ha un altro bug http://llvm.org/bugs/show_bug.cgi?id=11723.

+1

Penso che sia illegale. Vedi paragrafo [temp.param] 14.1/7 dello standard: "Un parametro modello non di tipo non deve essere dichiarato in virgola mobile, di classe o di tipo vuoto." – Constructor

+0

È necessario fornire un codice autonomo. Tutto quello che posso dire è che, come scritto, il tuo codice non viene compilato a causa della mancanza di include e mancante principale. –

+2

@ JohannesSchaub-litb Vedere [un semplice esempio] (http://ideone.com/hxuKmJ) che riproduce il problema. – Constructor

risposta

3

Entrambi i frammenti di codice che hai fornito non sono dare un senso, dal momento che non si può avere un pacchetto di espansione, senza un parametro di pacchetto non espanso: §14.5.3/5:

Il modello di un Expansion Pack deve nominare uno o più pacchetti di parametri che non sono espansi da un'espansione di pacchetti nidificati; tali pacchetti di parametri sono chiamati pacchetti di parametri non espansi nello schema.

Torna il problema reale: Se effettivamente utilizzato un pacchetto di espansione corretta e si istanziato che Expansion Pack con un parametro pacco non vuoto, la regola in §14.1/7 si applica, perché ovviamente un non-tipo il parametro del modello non può essere dichiarato avere il tipo void.

Fintanto che l'espansione del pacchetto non viene istanziata con un pacchetto di parametri non vuoto, nessuna regola viene violata, poiché non è stata eseguita la dichiarazione di parametro . :)

Problemi correlati