代码之家  ›  专栏  ›  技术社区  ›  xaxxon

Clang不会编译gcc将要编译的模板专门化

  •  7
  • xaxxon  · 技术社区  · 6 年前

    Gcc编译了这个fine,但是Clang(trunk)拒绝了消息:

    <source>:7:8: error: class template partial specialization is not more specialized than the primary template [-Winvalid-partial-specialization]
    

    https://godbolt.org/g/h8rsWC

    template<class T, T x>
    struct S{};
    
    template<int& x>
    struct S<int&, x> { };
    

    这个密码正确与否?

    1 回复  |  直到 6 年前
        1
  •  9
  •   xaxxon    6 年前

    这只体现在 -std=c++17 以后再说。“更专业”的决定需要 synthesizing a pair of function templates from the class templates , synthesizing unique types, values, and templates for the template parameters ,最后 performing template argument deduction in both directions . 如果在一个方向而不是另一个方向上演绎成功,模板就“更专业化”。

    在这里,叮当在推断 T 从两个来源得到不同的结果:

    • 从显式指定的 int& ,它推断 T := int& .
    • 从非类型参数 x ,它推断 T := int 按照通常的演绎规则(通常不演绎引用类型)。在C++ 17中添加了从非类型模板参数类型推断的能力。

    这使得演绎在两个方向上都失败了,所以部分专业化没有通过“更专业化”的测试。

    这看起来像是标准中的一个缺陷。解决方法是将 T型 在原始模板的非推导上下文中。