9

En ce qui concerne le code suivantspécialisation modèle partiel avec désadaptation `` int` et size_t` pas la compilation

#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); 
} 

Cela fonctionne sur clang, mais ne fonctionne pas sur gcc, quand je change le type de spécialisation partielle pour accepter std::size_t dans la séquence d'index, mais cela fonctionne.

Qui a raison? Clang ou gcc?


voir en action ici https://wandbox.org/permlink/5YkuimK1pH3aKJT4

Répondre

11

gcc est juste. Ceci est exactement [temp.deduct.type]/18:

Si P a une forme qui contient <i>, et si le type de i est différent du type de paramètre de modèle correspondant du modèle nommé par le enfermant simple modèle-id, la déduction échoue. Si P a un formulaire qui contient [i] et si le type de i n'est pas un type intégral, la déduction échoue. [Exemple:

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 
} 

- exemple final]

Reflétant l'exemple et la simplification de la question initiale:

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 
} 

Je pense que c'est bug clang 16279