Bri*_*ian 5 c++ templates dependent-name language-lawyer name-lookup
在 C++ 中,依赖名称的概念很重要,因为:
这样的名称是未绑定的,并且在模板实例化的点上查找……在模板定义的上下文和实例化点的上下文中
但是,该标准唯一说的是在[temp.dep]/2 中给出了依赖名称,指的是不合格的函数调用,基本上是为了使 ADL 能够对那些函数调用完全有效。
除了这些外,还有其他依赖名称吗?
考虑一些这样的代码,例如:
template <class T>
void foo(T t) {
t.bar();
};
Run Code Online (Sandbox Code Playgroud)
如果有人将其bar称为“从属名称” ,根据标准,这是否在技术上不正确地使用该术语?
感谢声明以及在哪里可以找到它们被 C++23 接受,现在有依赖名称类别的显式枚举,这似乎涵盖了问题中的代码。
在 N4919 [temp.dep.general]/2 中指出
[...] unqualified-id (7.5.4.2)的组件名称是相关的,如果
- 它是一个其conversion-type-id依赖的conversion-function-id ,或者
- 它是
operator=并且当前类是模板化实体,或者- unqualified -id是依赖调用中的后缀表达式。
在 [temp.dep.type]/5 中,给出了限定名称何时依赖的规则:
限定名称 (6.5.5) 是相关的,如果
- 它是一个其conversion-type-id依赖的conversion-function-id ,或者
- 它的查找上下文是相关的并且不是当前实例化,或者
- 它的查找上下文是当前实例化
operator=,或者- 它的查找上下文是当前实例化,并且至少有一个依赖基类,并且该名称的限定名称查找什么也找不到(6.5.5)。
t.bar()关于问题中给出的示例,该名称bar在引用的部分 (6.5.5) ([basic.lookup.qual]) 中描述为“成员限定名称”。此外,[basic.lookup.qual]/2 解释说它的“查找上下文”是“其关联对象表达式的类型(如果对象表达式依赖于类型,则被认为是依赖的)”。显然t是类型相关的,并且它是 的查找上下文bar,因此 [temp.dep.type]/5.2 适用,并且bar确实是一个依赖的限定名称。