gpt4 book ai didi

c++ - 使用 gcc 的别名模板替换和推断失败

转载 作者:IT老高 更新时间:2023-10-28 23:02:54 27 4
gpt4 key购买 nike

我相信我发现 gcc 的别名模板处理存在问题。本质上,当通过引用引用类型时,gcc 似乎无法正确地将别名的模板 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); // gcc yields a no matching function error
}

如上所述,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 没有正确地将别名模板的实例化类型(例如 Vec<int> )转换为别名类型(例如 vector<int, allocator<int>> )之前试图推导出 f2 和 g2 的实例化的模板参数。

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

最佳答案

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

   typedef Vec<int> vit;
vit v;

鉴于这是有效的,身份元功能可能也会起作用。

关于c++ - 使用 gcc 的别名模板替换和推断失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16862165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com