C++ 别名模板替换和gcc演绎失败

C++ 别名模板替换和gcc演绎失败,c++,templates,gcc,c++11,language-lawyer,C++,Templates,Gcc,C++11,Language Lawyer,我相信我发现了gcc别名模板处理的问题。本质上,当通过引用引用类型时,gcc似乎无法正确地将别名的模板id替换为别名模板实例化 我能够将一个混乱的真实世界问题变为一个小的变化,它是在C++ 11标准节TEMPP别名(145.7/2)中提供的非规范性例子: #包括 使用名称空间std; 模板 使用向量=向量; 模板 无效f1(TT-v); 模板 无效f2(TT&v); 模板 无效g1(TT-v); 模板 无效g2(TT&v); void foo() { Vec-v; f1(v);//gcc和cla

我相信我发现了gcc别名模板处理的问题。本质上,当通过引用引用类型时,gcc似乎无法正确地将别名的模板id替换为别名模板实例化

<>我能够将一个混乱的真实世界问题变为一个小的变化,它是在C++ 11标准节TEMPP别名(145.7/2)中提供的非规范性例子:

#包括
使用名称空间std;
模板
使用向量=向量;
模板
无效f1(TT-v);
模板
无效f2(TT&v);
模板
无效g1(TT-v);
模板
无效g2(TT&v);
void foo()
{
Vec-v;
f1(v);//gcc和clang都正确地生成匹配函数错误
g1(v);
f2(v);//叮当声产生一个不匹配的函数错误
g2(v);//gcc产生一个不匹配的函数错误
}
如上所述,clang 3.3(最近从svn获得)和gcc(4.7.2、4.8.0和4.8.1)同意按照标准处理f1/g1,但在处理f2/g2上有所不同(要明确的是,gcc的所有测试版本都接受对f2()的调用和对g2()的调用错误)。f1/g1和f2/g2之间的区别当然是后者使用了一个参考参数

在本例和我的实际问题中,所有迹象表明,gcc在尝试推导f2和g2实例化的模板参数之前,没有将别名模板的实例化类型(例如
Vec
)正确转换为别名类型(例如
vector


我的问题是:首先,这里的gcc确实是不正确的,并且叮当声是正确的,其次,是否有任何简单的方法(除了不使用别名模板)来说服gcc拒绝f2并匹配g2。

看起来编译器对推断有问题。显式调用模板可以实现一种变通方法——我无法解释为什么gcc不能像icpc或clang那样推断

对于icpc(ICC)13.1.0 20130121:

f1<Vec> (v);    // gcc and clang both correctly yield no matching function error
g1(v);
f2<Vec>(v);    // clang yields a no matching function error
g2(v);    // gcc yields a no matching function error
f1(v);//gcc和clang都正确地生成匹配函数错误
g1(v);
f2(v);//叮当声产生一个不匹配的函数错误
g2(v);//gcc产生一个不匹配的函数错误
对于gcc(gcc)4.7.2 20121109(Red Hat 4.7.2-8):

f1(v);//gcc和clang都正确地生成匹配函数错误
g1(v);
f2(v);//叮当声产生一个不匹配的函数错误
g2(v);//gcc产生一个不匹配的函数错误

事实上,这是一个GCC错误。一种解决方法是简单地添加
typedef

   typedef Vec<int> vit;
   vit v;
typedef-Vec-vit;
维生素v;

考虑到这是有效的,身份元函数可能也会起作用。

@DyP感谢您的链接,但不幸的是,这有点不同-没有进行任何推断。在我的问题中,问题是别名模板的替换点相对于演绎点的时间。f1被标准要求拒绝,因为v的类型实际上是
vector
,并且不能与单个参数匹配。哦,sry,我一定跳过了。。注意:一个别名模板名是不会被推论的。“你的代码> VEC <代码>和代码>矢量<代码>中提到的段落需要引用引号。(HTML解析正在清除尖括号之间的内容,因为它没有引用代码。)我试图为您添加这些内容,但似乎我的编辑被拒绝。GCC 4.8.1在您发布此内容前5小时发布:)这看起来像GCC中的一个错误,请向-谢谢!您好,我添加了语言律师标签,以帮助吸引那些倾向于知道这些问题答案的人。
f1<Vec> (v);    // gcc and clang both correctly yield no matching function error
g1(v);
f2<Vec>(v);    // clang yields a no matching function error
g2<vector>(v);    // gcc yields a no matching function error
   typedef Vec<int> vit;
   vit v;