C++ 允许“this->;”的规则是什么要访问依赖基类的成员?

C++ 允许“this->;”的规则是什么要访问依赖基类的成员?,c++,templates,language-lawyer,name-lookup,dependent-name,C++,Templates,Language Lawyer,Name Lookup,Dependent Name,正如我们所知,下面的代码格式不正确,因为成员x位于依赖基类中。但是,将指示行上的x更改为this->x,将修复错误 template <typename T> struct B { int x; }; template <typename T> struct C : B<T> { void f() { int y = x; // Error! } }; int main() { C<int> c;

正如我们所知,下面的代码格式不正确,因为成员
x
位于依赖基类中。但是,将指示行上的
x
更改为
this->x
,将修复错误

template <typename T>
struct B {
    int x;
};
template <typename T>
struct C : B<T> {
    void f() {
        int y = x; // Error!
    }
};
int main() {
    C<int> c;
    c.f();
}
模板
结构B{
int x;
};
模板
结构C:B{
void f(){
int y=x;//错误!
}
};
int main(){
C C;
c、 f();
}
我想解释一下标准中是如何规定这种行为的。根据[临时部门]/3:

在类或类模板的定义中,如果基类依赖于模板参数,则基类 在非限定名称查找期间,在类模板的定义点也不检查作用域 或成员,或在类模板或成员的实例化过程中

这似乎解释了为什么单独使用
x
会失败。在定义点查找名称
x
,不检查基类范围。但是,如果我们使用
this->x
?现在名称
x
是依赖的,其查找将推迟到实例化。但是引用的段落似乎暗示,即使在实例化时也不应该找到
x
,因为
this->x
中的
x
查找仍然是不合格的查找

显然,实现不会以这种方式运行,而且人们普遍认为,一旦模板被实例化,就会搜索基类范围

  • 我是否曲解了引用的段落
  • 是否有规定“正确”行为的段落

  • 类成员访问表达式(5.2.5.[expr.ref])不使用非限定的查找规则,它们使用类成员访问查找规则(3.4.5[basic.lookup.classref])

    (2) 如果类成员访问(5.2.5)中的id表达式是非限定id,则对象表达式的类型 属于类类型
    C
    ,将在类
    C
    的范围内查找不合格id


    这不是非限定查找(3.4.1[basic.lookup.unqual]),这是类成员访问表达式查找(3.4.5[basic.lookup.classref])。@n.m.谢谢,我没有意识到类成员名称查找是一种不同类型的名称查找。你应该回答这个问题,“依赖基类”到底是什么?而不是说一个独立的基类?有这样的事情吗?@EJP在
    模板结构C:B{…}
    中,
    B
    不是一个依赖的基类。这并没有真正说明为什么答案与非限定名称不同(它显然考虑了任何包含类的范围)。