模板专业化 - 与clang和gcc不同的结果

时间:2014-08-15 11:52:21

标签: c++ templates g++ clang++

我想根据给定的类型专门化一个模板结构,如下所示:

#include <iostream>
#include <array>

template<typename K>
struct Foo
{
    static constexpr unsigned value = 1;
};

template<typename K, unsigned CC>
struct Foo<std::array<K,CC>>
{
    static constexpr unsigned value = CC;
};

int main()
{
    std::cout << Foo<float>::value << std::endl; // should give 1
    std::cout << Foo<std::array<char,3>>::value << std::endl; // should give 3
}

然而,这会产生与clang和gcc不同的结果。我会说clang是正确的,而gcc是错误的。

输出gcc 4.8.2-19ubuntu1:

1
1

输出clang 3.4-1ubuntu3:

1
3

问题

  • 观察到的行为是否是gcc的错误?
  • 什么是正确的方法/与gcc一起使用的解决方法?

2 个答案:

答案 0 :(得分:2)

std::array第二个模板参数为size_t,而非无符号。

所以,如果你重写你的功能

template<typename K, std::size_t CC>
struct Foo<std::array<K,CC>>
{
    static constexpr unsigned value = CC;
};

两个编制者应该给出相同的结果。

答案 1 :(得分:0)

这是clang中的已知错误:g++ and clang++ different behaviour with integral template parameterhttp://llvm.org/bugs/show_bug.cgi?id=16279

  

17 - [...] []]模板参数类型应与模板参数的类型完全匹配,除了从数组绑定推导出的模板参数可以是任何整数类型。

正确的方法是使用std::size_t作为Foo的整数模板参数类型。