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

What is the definition of "dependent name" in C++?

提问人:Brian Bi 提问时间:2/14/2020 最后编辑:curiousguyBrian Bi 更新时间:10/3/2022 访问量:291

问:

在 C++ 中,依赖名称的概念很重要,因为:

这些名称是未绑定的,并在模板实例化时查找...在模板定义的上下文和实例化点的上下文中

但是,该标准唯一说的是 [temp.dep]/2 中给出的依赖名称,指的是非限定函数调用,基本上是为了让 ADL 对这些函数调用完全有效。

除了这些之外,还有其他受抚养人的名字吗?

考虑一些这样的代码,例如:

template <class T>
void foo(T t) {
    t.bar();
};

如果将该名称称为“从属名称”,根据标准,这在技术上是否不正确bar

C++ 模板 语言-律师 -查找 依赖项名称

评论

0赞 M.M 2/14/2020
[temp.dep.expr]/3 “如果...”
0赞 Brian Bi 2/14/2020
@M.M 我认为这还不够清楚(,与类型相关的 id-expression 是一个依赖名称)。我也不认为该段中的任何情况都适用于该示例。t.bar()
1赞 Brian Bi 2/14/2020
@NathanOliver 我们还没有C++,所以我有点怀疑这是否适用。我不认为这指的是任何名字。operator..
2赞 Brian Bi 2/14/2020
@Timo肯定是未知专用化的成员,因此是依赖于类型的表达式。我们是否要从中推断出这是一个依赖名称t.bart.barbar
1赞 Johannes Schaub - litb 2/15/2020
当然,这非常不清楚,因为依赖类型是远离依赖名称的评估步骤。事实上,一个名称可能经常进行名称查找,然后发现它指的是一个依赖类型,就像这里一样,is/refers-to 一个依赖类型,但为了知道这一点,它必须在模板中查找。所以它不能是一个依赖的名字,afaics ..我的C++变得生锈了:(template<class T> struct A { typedef T type; A<T>::type t; };A<T>::type

答:

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()bartbarbar