2014-05-01 13 views
6

gcc-4.8 akceptuje ten kod, ale czy to nie jest źle, ponieważ pakiet parametrów inny niż typ jest równoważny z void..., co jest nielegalne?nie jest paczką parametrów innego typu niż "nieważne ..."?

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

Próbowałem tego z clang-3.5, który również akceptuje. Czy jest to błąd kompilatora, czy coś nie rozumiem?


Pełny test kodu poniżej, który wykorzystuje niepoprawne puste pakiety parametrów w celu uproszczenia enable_if. Jest to prawie takie samo, jak w przypadku Flaming Dangerzone's Remastered enable_if, ale po zastąpieniu opakowanie staje się 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 kompiluje powyższy kod dobrze. clang nie, ale to dlatego, że ma inny błąd http://llvm.org/bugs/show_bug.cgi?id=11723.

+1

Myślę, że to jest nielegalne. Patrz paragraf [temp.param] 14.1/7 normy: "Nie można zadeklarować parametru szablonu typu" non-type "jako typu zmiennoprzecinkowego, klasy ani typu void." – Constructor

+0

Powinieneś podać własny kod. Wszystko, co mogę powiedzieć, to to, że napisany kod nie kompiluje się z powodu braku brakujących elementów i brakującej głównej. –

+2

@ JohannesSchaub-litb Zobacz [prosty przykład] (http://ideone.com/hxuKmJ), który odtwarza problem. – Constructor

Odpowiedz

3

obu fragmentów kodu Państwo przewidziane nie są sensu, ponieważ nie można mieć dodatku bez nierozszerzonym parametrów paczki: §14.5.3/5:

wzoru z Dodatek powinien nazwać jeden lub więcej pakietów parametrów, które nie są rozszerzane przez zagnieżdżone rozszerzenie paczki; takie pakiety parametrów są nazywane nieopisanymi pakietami parametrów we wzorcu.

Powrót do rzeczywistego problemu: Jeśli rzeczywiście użył właściwego dodatku i instancja tego dodatku z niepustym parametru Pack regułę w §14.1/7 dotyczy, bo oczywiście non-type parametru szablonu nie można zadeklarować jako typu pustego.

Dopóki ta ekspansja pakietu nie jest tworzona z niepustym pakietem parametrów, nie jest naruszana żadna reguła, ponieważ nie jest wykonywana deklaracja parametru . :)