函数模板内的解除类型和范围解析操作符

decltype and scope resolution operator inside a function template

本文关键字:范围 操作符 函数模板 类型      更新时间:2023-10-16

显然,下面的代码不能在gcc 4.7上编译:

#include <vector>
struct foo {
    std::vector<int> x;
    template<typename T>
    void bar(T) {
        decltype(x)::value_type y;
    }
};
int main() {
    foo f;
    f.bar(0);
}
编译错误如下:
test.cpp:8:9: error: need ‘typename’ before ‘decltype (((foo*)this)->foo::x)::value_type’ because ‘decltype (((foo*)this)->foo::x)’ is a dependent scope

我知道问题的解决方案,但为什么它不编译?这里的x不是一个依赖名称,那么为什么我需要明确地指出decltype(x)::value_type是一个类型,如果编译器已经可以自己计算出来?或者我错了,x实际上是一个从属名称?

直到有人找到关于这个的具体报告(我试着寻找,我找到的最接近的是这个),这确实与GCC 4.8.0编译。根据这些信息和我之前的怀疑,我想说这只是GCC 4.7中的一个错误,在4.8中被修复了。