【问题标题】:C++ lookup for dependent namesC++ 查找从属名称
【发布时间】:2019-03-20 16:34:30
【问题描述】:

在当前的 C++ 标准(2019 年 3 月)中,有这两个段落(强调我的):

[temp.res] p.2:

在模板声明或定义中使用并且依赖于模板参数的名称被假定为不命名类型除非适用的名称查找找到类型名称或名称由关键字类型名。 [...]

[temp.res] p.9:

在查找模板定义中使用的名称声明时,通常的查找规则([basic.lookup.unqual]、[basic.lookup.argdep])用于非依赖名称。依赖于模板参数的名称查找被推迟到知道实际的模板参数([temp.dep])。 [...]

第一段暗示依赖于模板参数的名称将通过“适用名称查找”进行查找。

但是,第二段指出,依赖于模板参数的名称的查找被推迟到知道模板参数为止。

作为第一段一部分的示例包括类似于以下情况的情况:

template <typename T>
class A
{
    void f()
    {
        T* p;
    }
};

在方法f中,我认为T是一个“依赖于模板参数的名称”,因此它的查找应该推迟到知道T,因此没有“适用的名称查找”,名称应该假定不命名类型。

如果第二个引用的段落似乎声明没有执行查找,那么第一个引用的段落“除非适用的名称查找找到类型名称”是什么意思?我错过了什么吗?

谢谢。

【问题讨论】:

标签: c++ templates language-lawyer


【解决方案1】:

推迟查找dependent names:例如,fooT::fooBar&lt;T&gt;::foo 等上下文中,或operator@T() @ 0 等上下文中。显然,TBar 必须自己查找才能知道涉及到模板参数(模板参数can be hidden)并解析模板参数列表。由于(类型)模板参数是 typedef-name 并且 Bar 的任何特化都是类型,因此“名称查找会找到类型名称”。

【讨论】:

  • 感谢您的回答。在我看来,模棱两可的一件事是使用两种构造:“依赖名称”(在您链接的第一段中定义)和“依赖于模板参数的名称”(未明确定义)。第 9 段使用后一种措辞。根据“依赖名”的定义,A(其中A是类模板,T是模板参数)不是“依赖名”。如果该模板在被引用后是专门的,会发生什么? [继续]
  • 是在考虑使用之前只声明了特化,还是在使用实例化点之前声明了所有特化?第 9 段说查找被推迟,但它是否在其他地方指定了搜索的位置?
  • 另外,我认为第 2 段应该改写为:“在模板声明或定义中使用并且依赖于模板参数的名称被假定为不命名类型,除非它可以确定作为类型名称(此过程可能包括名称的非依赖部分的名称查找)或名称由关键字 typename 限定。[...]”。这是正确的解释吗?
  • @user42768:较长的公式是identified,较短的公式。 A&lt;T&gt; 不是从属 name 而是 dependent type。当引用模板为 instantiated 时,会咨询专业化。在instantiation context 中查找相关的名称。我确信 [temp.res]/2 可以改进,但我们可能比“除非我们知道它不是类型”,否则我们可以做得更好。
  • @user42768:我应该说你提议的改写看起来“正确”,因为我认为你理解规则;这不是完全正确的,因为诸如查找最终是模板参数的名称之类的事情(这肯定是依赖的——在查找之后)。
猜你喜欢
  • 2019-03-29
  • 2011-01-17
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2016-08-05
相关资源
最近更新 更多