允许`this->`访问依赖基类的成员的规则是什么?
What is the rule that allows `this->` to access members of dependent base classes?
正如我们所知,下面的代码格式错误,因为成员 x
位于依赖基 class 中。但是,将指示行上的 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:
In the definition of a class or class template, if a base class depends on a template-parameter, the base class
scope is not examined during unqualified name lookup either at the point of definition of the class template
or member or during an instantiation of the class template or member.
这似乎可以解释为什么单独使用 x
会失败。在定义点查找名称 x
,不检查基本范围 class。但是,如果我们使用 this->x
呢?现在名称 x
是依赖的,它的查找被推迟到实例化。但是引用的段落似乎暗示即使在实例化时 也不应该找到 x
, 因为在 this->x
中查找 x
是 仍然不合格查找。
显然,实现不会以这种方式运行,并且人们普遍认为,一旦实例化模板,就会搜索基本 class 范围 。
- 我是否误解了引用的段落?
- 是否有指定 "correct" 行为的段落?
Class 成员访问表达式 (5.2.5. [expr.ref]) 不使用不合格的查找规则,它们使用 class 成员访问查找规则 (3.4.5 [ basic.lookup.classref]).
(2) If the id-expression in a class member access (5.2.5) is an unqualified-id, and the type of the object expression
is of a class type C
, the unqualified-id is looked up in the scope of class C
.
正如我们所知,下面的代码格式错误,因为成员 x
位于依赖基 class 中。但是,将指示行上的 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:
In the definition of a class or class template, if a base class depends on a template-parameter, the base class scope is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class template or member.
这似乎可以解释为什么单独使用 x
会失败。在定义点查找名称 x
,不检查基本范围 class。但是,如果我们使用 this->x
呢?现在名称 x
是依赖的,它的查找被推迟到实例化。但是引用的段落似乎暗示即使在实例化时 也不应该找到 x
, 因为在 this->x
中查找 x
是 仍然不合格查找。
显然,实现不会以这种方式运行,并且人们普遍认为,一旦实例化模板,就会搜索基本 class 范围 。
- 我是否误解了引用的段落?
- 是否有指定 "correct" 行为的段落?
Class 成员访问表达式 (5.2.5. [expr.ref]) 不使用不合格的查找规则,它们使用 class 成员访问查找规则 (3.4.5 [ basic.lookup.classref]).
(2) If the id-expression in a class member access (5.2.5) is an unqualified-id, and the type of the object expression is of a class type
C
, the unqualified-id is looked up in the scope of classC
.