Ist ein nicht typisiertes Parameterpaket, das als ungültig ausgewertet wird, nicht zulässig?

gcc-4.8 akzeptiert diesen Code, ist aber nicht falsch, da das Parameterpaket ohne Typ äquivalent zu istvoid... was ist illegal?

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

Ich habe das auch mit clang-3.5 versucht, was es auch akzeptiert. Handelt es sich um einen Compiler-Fehler, oder verstehe ich etwas falsch?

Vollständiger Testcode unten, der leere Parameterpakete ohne Typ verwendet, um enable_if zu vereinfachen. Dies ist fast das gleiche wie inRemastered enable_if von Flaming Dangerzone außer nach ersatz wird die packungvoid....

#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 kompiliert den obigen Code einwandfrei. Clang tut es nicht, aber das liegt daran, dass es einen anderen Bug hathttp://llvm.org/bugs/show_bug.cgi?id=11723.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage