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