提问人:Brian Bi 提问时间:2/14/2020 最后编辑:curiousguyBrian Bi 更新时间:10/3/2022 访问量:291
C++中“依赖名称”的定义是什么?
What is the definition of "dependent name" in C++?
问:
在 C++ 中,依赖名称的概念很重要,因为:
这些名称是未绑定的,并在模板实例化时查找...在模板定义的上下文和实例化点的上下文中
但是,该标准唯一说的是 [temp.dep]/2 中给出的依赖名称,指的是非限定函数调用,基本上是为了让 ADL 对这些函数调用完全有效。
除了这些之外,还有其他受抚养人的名字吗?
考虑一些这样的代码,例如:
template <class T>
void foo(T t) {
t.bar();
};
如果将该名称称为“从属名称”,根据标准,这在技术上是否不正确?bar
答:
1赞
Brian Bi
10/3/2022
#1
多亏了 C++23 中接受的声明以及在哪里可以找到它们,现在有一个明确的依赖名称类别枚举,这似乎涵盖了问题中的代码。
在 N4919 [temp.dep.general]/2 中指出,
[...]unqualified-id (7.5.4.2) 的组件名称依赖于以下情况
- 它是一个 conversion-function-id,其 conversion-type-id 是依赖的,或者
- 它是,并且当前类是模板化实体,或者
operator=
- unqualified-id 是依赖调用中的后缀表达式。
在 [temp.dep.type]/5 中,给出了限定名称何时依赖的规则:
限定名 (6.5.5) 在以下情况下是必需的
- 它是一个 conversion-function-id,其 conversion-type-id 是依赖的,或者
- 它的查找上下文是依赖的,不是当前实例化,或者
- 它的查找上下文是当前实例化,它是 或
operator=
- 它的查找上下文是当前实例化,并且至少有一个依赖基类,并且该名称的限定名称查找未找到任何内容 (6.5.5)。
关于问题中给出的示例,该名称在引用的章节 (6.5.5) ([basic.lookup.qual]) 中被描述为“member-qualified-name”。此外,[basic.lookup.qual]/2 解释说,它的“查找上下文”是“其关联对象表达式的类型(如果对象表达式与类型相关,则视为从属)”。显然,它是与类型相关的,并且是 的查找上下文,因此 [temp.dep.type]/5.2 适用,并且确实是一个从属限定名称。t.bar()
bar
t
bar
bar
评论
t.bar()
operator.
.
t.bar
t.bar
bar
template<class T> struct A { typedef T type; A<T>::type t; };
A<T>::type