【问题标题】:Is it a defect in the standard about dependent name resolution for template关于模板的依赖名称解析的标准是否存在缺陷
【发布时间】:2020-10-09 06:02:57
【问题描述】:

关于如何查找模板的依赖名称,标准只给出了这样的一小句话,没有更多:

在解析从属名称时,会考虑来自以下来源的名称:

  1. 模板定义点可见的声明。
  2. 来自与函数参数类型关联的命名空间的声明,来自实例化上下文 ([temp.point]) 和定义上下文。

考虑下面的代码

struct Test{
  using type = int;
};
// #1
template<typename T>
struct TMP{
  using type = typename T::type;
};
int main(){
  TMP<Test>::type v = 0;
}

对于此代码,名称type 确实是一个依赖名称,因为 T 是一个模板参数,这里不是函数调用,所以,唯一相关的要点是数字 1。它只是说依赖名称应该是可见的在模板定义之前,这意味着在我的代码中,声明应在#1 可见。实际上,typename T::type 是一个qualified-id,因此适用于它的限定名查找规则,并且因为T 是一个模板参数,所以查找动作应该在给定模板参数之后发生,即在实例化一个这种模板的专业化。但我引用的引文并没有说明这一点。所以,我想知道这是标准中的缺陷吗?如果我遗漏了标准中对此进行解释的任何内容,请在此问题中引用它们。

【问题讨论】:

标签: templates c++17 language-lawyer


【解决方案1】:

要完成language-lawyer cmets,在this page 的§“未知专业化”中

在模板定义中,推断出某些名称属于 特别是未知的专业,

  • 限定名称,如果出现在 :: 左侧的任何名称是不属于当前实例化成员的依赖类型
  • ...

在你的struct TMP

  • 类型T确实是一个依赖类型
  • 表达式 typename T::type 是限定名称,如果 :: 是依赖类型,则在左侧
  • 那个表达式变成了一个未知的特化

然后说:

未知特化的成员总是依赖的,并且在实例化点被查找和绑定为所有依赖名称

允许在实例化点查找TMP&lt;Test&gt;::type

【讨论】:

  • T 类型确实是从属名 No it isn't
  • @LanguageLawyer 啊,那么依赖类型? The following types are dependent types: * template parameter同一页
  • 看起来像一个依赖类型。
  • @LanguageLawyer 对措辞错误感到抱歉...让我更正一下
  • @LanguageLawyer 同意,但即使在那里,措辞也很难正确,标准上更是如此。我花了一些时间试图了解您的 cmets 并将它们投射到 cppref 上所说的内容上,不幸的是您发布的标准参考资料并不是很有帮助,尽管肯定更准确。
猜你喜欢
  • 2021-10-18
  • 2021-12-09
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多