Объявление члена-функции специализации шаблонного класса

При компиляции MySQL c -std=c++20 получил следующую ошибку: error: expected unqualified-id before ‘)’ token.

Проблемный участок кода:

template<std::size_t N>
class Bitmap { ... };

template<>
class Bitmap<64>
{
public:
    Bitmap<64>() { ... };
    //........^
};

Так как объявление полной специализации шаблонного класса идентично объявлению обычного класса, то и для объявления членов-функций специализации шаблонного класса должен быть использован обычный синтаксис:

template<>
class Bitmap<64>
{
public:
    Bitmap() { ... };
};

К сожалению, я не смог найти в стандарте "прямого" подтверждения (или опровержения) вышесказанному, поэтому прошу вашей помощи.


Я пробовал компилировать этот код GCC и Clang. Последний не выдает ошибок ни с C++17, ни с C++20. GCC с C++17 так же собирает код без ошибок. Интересно, что изменение кода на:

template<>
class Bitmap
{
public:
    explicit Bitmap<64>() { ... };
};

приводит к тому, что и GCC перестает выдывать ошибки даже с -std=c++20. Это уже похоже на баг в компиляторе.


Ответы (1 шт):

Автор решения: isnullxbh

Кажется, данное описание изменений отвечает на вопрос:

Affected subclauses: [class.ctor] and [class.dtor]
Change: A simple-template-id is no longer valid as the declarator-id of a constructor or destructor.
Rationale: Remove potentially error-prone option for redundancy.
Effect on original feature: Valid C++ 2017 code may fail to compile in this revision of C++. For example:

template<class T>
struct A {
  A<T>();           // error: simple-template-id not allowed for constructor
  A(int);           // OK, injected-class-name used
  ~A<T>();          // error: simple-template-id not allowed for destructor
};

Т.е, С++20 требует использовать injected-имя класса для объявления конструктора\деструктора шаблона класса.

→ Ссылка