约束模板特化的前向声明



我一直在使用c++ 20概念进行约束部分类模板特化一段时间了,它们工作得很好,但是当我试图向前声明它们时,我遇到了一个问题:

#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错误地拒绝了代码。

抛弃intfloat的概念并显式专门化也被GCC所接受(godbolt的例子)。

你知道这是怎么回事吗?

是一个bug;现在是固定的。不知道这个修复会变成哪个版本。

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

最新更新