下面的代码在 Clang 中编译并正常工作,但在 GCC 中它给出了错误:
<source>:9:14: error: explicit specialization in non-namespace scope 'class DecideType<A, B>'
template<int A, int B> class DecideType
{
template<bool CONDITION = A < B> class RealDecision
{
public:
using type = int;
};
template<> class RealDecision<false>
{
public:
using type = char;
};
public:
using type = typename RealDecision<>::type;
};
只需添加一些额外的、未使用的模板参数,就可以很容易地为 GCC 修复代码。
template<int A, int B> class DecideType
{
template<class X, bool CONDITION = A < B> class RealDecision
{
public:
using type = int;
};
template<class X> class RealDecision<X, false>
{
public:
using type = char;
};
public:
using type = typename RealDecision<void>::type;
};
哪个编译器是正确的,为什么?我发现了一个更改提案,建议自 C++17 以来在这种情况下应该允许完全专业化,但我不知道这是否正式在标准中。https://wg21.cmeerw.net/cwg/issue727
如果 GCC 是正确的,为什么部分专业化和显式专业化之间存在这种差异?毕竟,显式特化只是部分特化的特例。
编辑 0
有一个 C++17 的错误报告https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85282。我认为它被拒绝了,但据我所知,这似乎还没有定论。我不知道它是否可以得出关于 C++20 的任何结论。