9

Mit Bezug auf den folgenden Code kompiliertPartielle Template-Spezialisierung mit unpassender `int` und` size_t` nicht

#include <utility> 
#include <cassert> 

template <typename T> 
struct Wot; 
template <int... ints> 
struct Wot<std::index_sequence<ints...>> {}; 

int main() { 
    assert(sizeof(Wot<std::index_sequence<1, 2, 3>>) == 1); 
} 

Diese auf Klirren arbeitet aber auf gcc nicht funktioniert, wenn ich die Art der partiellen Spezialisierung ändern zu akzeptieren std::size_t in der Index-Sequenz, aber es funktioniert.

Wer hat Recht? Clang oder GCC?


dies hier in Aktion https://wandbox.org/permlink/5YkuimK1pH3aKJT4

Antwort

11

gcc richtig ist. Das ist genau die [temp.deduct.type]/18:

Wenn P eine Form hat, die <i> enthält, und wenn die Art der i unterscheidet mich von der Art der entsprechenden Template-Parameter der von dem umschließenden einfach-template-ID benannte Vorlage, Abzug schlägt fehl. Wenn P über ein Formular verfügt, das [i] enthält und wenn der Typ i kein integraler Typ ist, schlägt der Abschlag fehl. [Beispiel:

template<int i> class A { /* ... */ }; 
template<short s> void f(A<s>); 
void k1() { 
    A<1> a; 
    f(a);    // error: deduction fails for conversion from int to short 
    f<1>(a);   // OK 
} 

template<const short cs> class B { }; 
template<short s> void g(B<s>); 
void k2() { 
    B<1> b; 
    g(b);    // OK: cv-qualifiers are ignored on template parameter types 
} 

- Ende Beispiel]

Mirroring das Beispiel und die Vereinfachung der ursprünglichen Frage:

template <class T> struct Wot { }; 

template <int... ints> 
void foo(Wot<std::index_sequence<ints...>>) { } 

int main() { 
    foo(Wot<std::index_sequence<1, 2, 3>>{}); // error 
    foo<1, 2, 3>({}); // ok 
} 

Ich denke, das Klirren Bug ist 16279

Verwandte Themen