【发布时间】:2020-02-20 00:03:19
【问题描述】:
这是我正在尝试编译的程序。
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();
}
我在 gcc 9.2、clang 9.0.0 和 icc19.0.1 中看到了不同的行为。
该程序无法使用 gcc 进行编译,并给出错误 U has not been declared,使用 clang 可以正常编译,并且使用 icc 进行了非常重要的程序集。
为什么这些编译器的行为不同?
我尝试阅读dependent_name,但由于无法正确阅读而放弃了。据我所知,结构D 中的数据成员b 具有依赖类型,而U 应该在模板实例化时被解析。
在 godbolt.org 上使用上述编译器编译上述代码:https://godbolt.org/z/n_Wl44。我使用带有 -O3 标志的 C++17。提前谢谢!!!
【问题讨论】:
-
如果你把所有的编译器都带进来,看起来像 50/50:godbolt.org/z/F1JnWH
-
@TedLyngmo 哇,太棒了。我不知道一致性查看器。
-
几天前我自己注意到了。非常好!但我怀疑这是一个小错误。颜色并不总是与结果匹配等。
-
我认为这只是 GCC 中的一个错误。你应该举报。
-
Gcc 应该找到 U,因为它是 D 中的从属名称,并且由于限定成员名称查找规则:eel.is/c++draft/basic.lookup.classref#4。
标签: c++