受限模板特化的前向声明

Forward Declaration of Constrained Template Specializations

一段时间以来,我一直在使用 C++20 概念进行约束部分 class 模板特化,它们工作得很好,但是我和 运行 在尝试转发声明时遇到了问题他们:godbolt example

#include <concepts>

template <class T>
concept Integer = std::is_same_v<T,int> || std::is_same_v<T,unsigned int>;

template <class T>
concept Float = std::is_same_v<T,float> || std::is_same_v<T,double>;

template <class T>
class S
{};

template <Integer T>
class S<T>;

// This forward declaration breaks GCC
template <Float T>
class S<T>;

template <Integer T>
class S<T>
{};

template <Float T>
class S<T>
{};

int main()
{
    S<int> s_int;
    S<float> s_float;
}

第二次前向声明

// This forward declaration breaks GCC
template <Float T>
class S<T>;

破坏了 GCC,但 Clang 和 MSVC 没有问题。我过去曾 有概念(但仍未修复),但情况恰恰相反:GCC 符合要求,但 Clang 和 MSVC 错误地拒绝了代码。

GCC 也接受放弃概念并明确专门针对 intfloat (godbolt example)。

知道这里发生了什么吗?

是一个错误;现在是固定的。不知道这个修复会进入哪个版本。

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96363