我一直在使用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错误地拒绝了代码。
抛弃int
和float
的概念并显式专门化也被GCC所接受(godbolt的例子)。
你知道这是怎么回事吗?
是一个bug;现在是固定的。不知道这个修复会变成哪个版本。
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96363