在 GCC 4.6 和 4.7 上模板模板扣除的两个不同结果
Two different results on GCC 4.6 and 4.7 for template template deduction
考虑以下代码:
#include <iostream>
#include <vector>
#include <array>
#include <type_traits>
// Version A
template<typename T>
void f(const T& x)
{
std::cout<<"Version A"<<std::endl;
}
// Version B
template<typename... T1, template<typename...> class T>
void f(const T<T1...>& x)
{
std::cout<<"Version B"<<std::endl;
}
// Version C
template<typename T1 = double, typename TN = size_t, template<typename, TN...> class T, TN... N>
void f(const T<T1, N...>& x)
{
std::cout<<"Version C"<<std::endl;
}
// Main
int main(int argc, char* argv[])
{
f(double());
f(std::vector<double>());
f(std::array<double, 3>());
return 0;
}
Windows 上的 GCC 4.6.2 提供:
Version A
Version B
Version C
Linux 上的 GCC 4.7.1 给出:
Version A
Version B
Version A
所以问题是:为什么?这是一个错误还是未定义的行为?我应该将其发布在 GCC 错误报告中吗?
它看起来像 gcc 4.7.x 中的一个错误(4.7.2 也有同样的问题)。 下面是一个更简单的示例:
template<int N> struct S {};
template<typename T = int, T N> void f(S<N>) {}
int main() { S<1> s; f(s); }
GCC 4.7.2 失败并显示:
source.cpp:3:25: error: no matching function for call to 'f(S<1>&)'
source.cpp:3:25: note: candidate is:
source.cpp:2:38: note: template<class T, T N> void f(S<N>)
source.cpp:2:38: note: template argument deduction/substitution failed:
相关文章:
- 如何返回一个类的两个对象相加的结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 这两个代码片段相似,但显示的结果不同
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 为什么同一个逻辑方程在python和c++中返回两个不同的结果
- 为什么这两个相似的代码计算行列式的结果不同?
- 如何通过键和值以及在C 中的结果映射中比较两个地图?我们有任何STL API吗?
- 如何乘以两个值并原子存储结果
- *char数组到字符串(两次运行代码和两个不同的结果)
- 运算符的两个不同结果 - 在 c++11 中
- 在发布版本中划分两个双精度的结果错误
- 两个结果的std :: chrono :: high_resolution_clock :: now()给出了〜270n
- C++:两个单独的函数在嵌套时返回不同的结果?
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 随机洗牌似乎会产生相同的结果,但仅在前两个实例中产生相同的结果.我如何避免这种情况
- 运算符*=来自两个实例(矩阵),结果不好
- 在 GCC 4.6 和 4.7 上模板模板扣除的两个不同结果
- 在将两个结果行写入文件之前比较用fprintf生成的结果行