Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why isn't this class specialization using a concept accepted?

The following code attempts to partially specialize a class using a concept and add a method to the specialization, but it is rejected by clang 11.0.0:

#include <concepts>

template <typename T> // note: previous template declaration is here
struct S {};

template <std::integral T>
struct S<T>
{
    void f();
};

template <std::integral T> // error: type constraint differs in template redeclaration
void S<T>::f()
{
}

clang gives the error message:

<source>:14:16: error: type constraint differs in template redeclaration
template <std::integral T>
               ^
<source>:3:11: note: previous template declaration is here
template <typename T>

(see https://godbolt.org/z/Wv1ojK). Why is this code wrong? Or is this a bug in clang? (FWIW, this code is accepted by gcc trunk and by MSVC 19.28, although that's no guarantee of correctness.)

like image 305
Nathan Reed Avatar asked Nov 11 '20 04:11

Nathan Reed


1 Answers

This is definitely a CLANG bug. It is already filed - #48020.

like image 66
NutCracker Avatar answered Sep 20 '22 12:09

NutCracker