3

下面的代码在 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 的任何结论。

4

0 回答 0