2016-06-05 21 views
9

Si consideri il seguente:parzialmente specializzata in materia di non-tipo di parametro template del tipo sbagliato

template <unsigned > 
struct uint_ { }; 

template <class > 
struct X { 
    static constexpr bool value = false; 
}; 

template <int I> // NB: int, not unsigned 
struct X<uint_<I>> { 
    static constexpr bool value = true; 
}; 

int main() { 
    static_assert(X<uint_<0>>::value, "!"); 
} 

clang compila il codice, gcc non lo fa.

Tuttavia, nel seguente esempio altamente corrispondenti

template <unsigned > 
struct uint_ { }; 

template <int I> // NB: int, not unsigned 
void foo(uint_<I>) { } 

int main() { 
    foo(uint_<0>{}); 
} 

entrambi compilatori respingono senza alcuna funzione di corrispondenza chiamata foo. Il comportamento di gcc è coerente, Clang's non lo è, quindi uno o l'altro compilatore ha un bug per uno o entrambi gli esempi. Quale compilatore è corretto?

risposta

7

GCC è corretto. [temp.deduct.type]/17:

Se P ha una forma che contiene <i>, e se il tipo di corrispondente valore A differisce dal tipo di i, deduzione fallisce.

+1

Bello e diretto. Archiviato come [28010] (https://llvm.org/bugs/show_bug.cgi?id=28010) – Barry

Problemi correlati