模板专门化——clang和gcc的结果不同
Template specialization - different results with clang and gcc
我想根据给定的类型专门化一个模板结构体,如下所示:
#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
的积分模板参数类型
相关文章:
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 转换为标准时,Clang和GCC中的不同结果::可选<T>
- 为什么 std::locale( " " ).name() 在 clang 和 gcc 上给出不同的结果?
- 在这种情况下,GCC 和 clang 是否显示与 Visual Studio 相同的结果,关于语言链接?
- 未经GCC优化而编译的简单C++程序不会产生预期的结果
- 菱形层次结构中的虚函数重载在 clang 和 gcc 中产生不同的结果
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 为什么 GCC 调用 libc 的 sqrt() 而不使用其结果?
- 使用 constexpr 函数的结果作为模板参数(clang vs gcc)
- 相同的AVX2程序在gcc和msvc中产生不同的结果
- 为什么 gcc 和 clang 为我的程序编译为不同的"const"结果?
- 用不同版本的Ubuntu上的GCC编译会产生不同的结果
- GCC:为什么编译.HPP文件与.cpp文件的结果不同
- 在 GCC 4.6 和 4.7 上模板模板扣除的两个不同结果
- 为什么不同的 GCC 4.9.2 安装为此正则表达式匹配给出不同的结果
- gdb中的C++static_cast返回的结果与gcc不同
- 编译一个相当简单的c++11程序时,gcc和clang之间的结果不同
- 将 C++11 正则表达式与 gcc 4.8.2 一起使用时会出现奇怪的结果(但适用于 Boost 正则表达式)
- 自分配中的后增量,VS2013和GCC之间的结果不同