模板专门化——clang和gcc的结果不同

Template specialization - different results with clang and gcc

本文关键字:结果 gcc 专门化 clang      更新时间:2023-10-16

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

#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?

std::array第二个模板参数是size_t,不是unsigned

所以,如果你把函数重写成

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

两个编译器应该给出相同的结果

这是clang: g++和clang++中一个已知的错误,不同的行为与积分模板参数,http://llvm.org/bugs/show_bug.cgi?id=16279

17 -[…]模板实参的类型必须与模板形参的类型完全匹配,但从数组中导出的模板实参可以是任意整型。

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

相关文章: