尝试解决GCC特定的编译错误

Mut*_*ect 5 c++

这是我要编译的程序。

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标志一起使用。提前致谢!!!

wal*_*nut 4

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 的衍生物,因此独立编译器对此并不存在异议。