首页 文章

允许`this->`访问依赖基类成员的规则是什么?

提问于
浏览
15

我们知道,下面的代码格式错误,因为成员 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();
}

我想解释一下标准中如何指定这种行为 . 根据[temp.dep] / 3:

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

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

很明显,实现并不广泛地理解,一旦模板被实例化,就会搜索基类范围 .

  • 我是否误解了引用的段落?

  • 是否有指定"correct"行为的段落?

1 回答

  • 7

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

    (2)如果类成员访问(5.2.5)中的id-expression是非限定id,并且对象表达式的类型是类类型C,则在范围内查找unqualified-id C级

相关问题