这是我要编译的程序。
template <typename T>
struct A
{
T foo() const
{
return 1;
}
};
template <typename T>
struct B : A<T>
{
using U = A<T>;
T foo() const
{
return 2;
}
};
template <typename T>
struct D
{
B<T> b;
int foo() const
{
// using U = typename B<T>::U; // compilation succeeds if I uncomment this line
return b.U::foo();
}
};
int main()
{
D<int> d;
return d.foo();
}
Run Code Online (Sandbox Code Playgroud)
我在gcc 9.2,clang 9.0.0和icc19.0.1中看到了不同的行为。该程序无法使用gcc编译并给出错误U has not been declared,无法使用clang进行编译,并且无法使用icc进行汇编。为什么这些编译器之间的行为不同?
我尝试读取Dependent_name,但由于无法正确遵循而放弃了。据我所知,bstruct内部的数据成员D具有依赖类型,并且U在实例化模板时应该已经解决了。
在Godbolt.org上通过上述编译器编译了以上代码:https ://godbolt.org/z/n_Wl44 。我将C ++ 17与-O3标志一起使用。提前致谢!!!
Uin应该在实例化期间在第一个、find 的b.U::foo();上下文中查找,以便调用在 中定义的。[basic.lookup.classref]/4B<T>using U = A<T>;b.U::foo()foo()A<T>
查找应延迟到实例化,并且不应查找定义,因为b它的类型依赖于模板参数T。[温度.dep.表达式]/5
因此这似乎是 GCC 中的一个错误。在此错误报告中发布了一个非常相似的代码示例,据我所知,它演示了相同的问题。该错误当前标记为“新”状态。
据我所知,@TedLyngmo 发布的 godbolt.org 一致性视图中显示的其他失败编译器是 GCC 的衍生物,因此独立编译器对此并不存在异议。