C ++中“依赖名称”的定义是什么?

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称为“从属名称” ,根据标准,这是否在技术上不正确地使用该术语?

Bri*_*ian 1

感谢声明以及在哪里可以找到它们被 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确实是一个依赖的限定名称。