受限模板特化的前向声明
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 也接受放弃概念并明确专门针对 int
和 float
(godbolt example)。
知道这里发生了什么吗?
是一个错误;现在是固定的。不知道这个修复会进入哪个版本。
一段时间以来,我一直在使用 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 也接受放弃概念并明确专门针对 int
和 float
(godbolt example)。
知道这里发生了什么吗?
是一个错误;现在是固定的。不知道这个修复会进入哪个版本。