15

众所周知,下面的代码格式错误,因为该成员x位于依赖基类中。但是,更改xthis->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也不应该找到,因为in的查找仍然不合格的查找。xthis->x

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

  1. 我是否误解了引用的段落?
  2. 是否有一段指定“正确”行为的段落?
4

1 回答 1

7

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

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

于 2015-09-19T07:44:40.673 回答