我相信我发现了gcc的别名模板处理问题.实质上,当通过引用引用类型时,gcc似乎无法正确地将别名的template-id替换为别名模板实例化.
我能够将一个混乱的现实问题简化为C++ 11标准部分temp.alias(14.5.7/2)中提供的非规范示例的微小变化:
#include <vector>
using namespace std;
template <class T>
using Vec = vector<T, allocator<T>>;
template <template <class> class TT>
void f1(TT<int> v);
template <template <class> class TT>
void f2(TT<int>& v);
template <template <class, class> class TT>
void g1(TT<int, allocator<int>> v);
template <template <class, class> class TT>
void g2(TT<int, allocator<int>>& v);
void foo()
{
Vec<int> v;
f1(v); // gcc and clang both correctly yield no matching function error
g1(v);
f2(v); // clang yields a no matching function error
g2(v); …
Run Code Online (Sandbox Code Playgroud)