Vin*_*ent 5 c++ gcc templates metaprogramming c++11
考虑以下代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
Windows上的GCC 4.6.2给出:
Version A
Version B
Version C
Run Code Online (Sandbox Code Playgroud)
和Linux上的GCC 4.7.1给出:
Version A
Version B
Version A
Run Code Online (Sandbox Code Playgroud)
所以问题是:为什么?这是一个错误还是未定义的行为?我应该把它发布在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); }
Run Code Online (Sandbox Code Playgroud)
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:
Run Code Online (Sandbox Code Playgroud)