【问题标题】:Are unqualified names of non-static data members with dependent types dependent具有依赖类型的非静态数据成员的非限定名称是否依赖
【发布时间】:2019-08-17 02:30:31
【问题描述】:

从属名称在 C++ 标准中没有明确定义,因此在确定什么是从属名称方面还有很多不足之处,这让我想到了这个问题:是非静态数据的非限定名称依赖类型依赖的成员? 例如:

template<typename T>
struct S { T t; };

这里的名称t 是从属名称吗?类型当然是依赖的,但不清楚名称是否依赖,因为它总是可以解析为引用成员。

【问题讨论】:

  • 我相信全名不是t,而是S&lt;T&gt;::t。因此它将是依赖的。但我对此并不确定,无法给出实际答案。
  • @NicolBolas 一些消息来源似乎表明措辞不完整,“从属名称”也适用于类型和数据成员的名称。
  • @KrystianS:你用language-lawyer 标记了这个问题,所以你想要一个完全基于标准的答案,而不是“几个来源似乎陈述的”。您的问题在应用于标准时没有意义,因为根据该术语的定义,裸标识符从不是“从属名称”。
  • @KrystianS:“一些消息来源似乎表明措辞不完整,“从属名称”也适用于类型和数据成员的名称。”认为这来自 people 使用术语“依赖名称”的方式与 standard 使用它的方式之间的差异。因为我从来没有真正查过这个词,而且它比我被引导相信的要狭窄得多。但在该术语的使用上,标准与本身是一致的;问题是其他人,而不是标准。
  • @NicolBolas 好的,那么按照标准中的定义,依赖名称只是在满足该列表要求的函数调用中使用的非限定ID>

标签: c++ templates language-lawyer name-lookup dependent-name


【解决方案1】:

不,t 不依赖。虽然有一个 open issue 关于扩展依赖名称的定义,但名称依赖的想法是延迟查找它。 (即使没有 ADL,也请考虑查找 T::foo,它可能是函数、函数模板或数据成员(没有 template 或 typename)。)这里不是这样; t(在 S 内部的上下文中)立即解析为类成员。

【讨论】:

  • 标准中的官方定义只说在某些上下文中函数调用中的非限定id是一个依赖名称,所以除非T::foo在函数调用中,否则它不会是一个从属名称,对吗?
  • @KrystianS:正确:您已经在标准中发现了问题。请注意,已发布的 C++11 并不要求依赖名称是不合格的,但其定义存在其他问题。在修复 C++20 的错误时,这一切都有可能得到解决。
  • 看起来您链接的问题与我的想法相同:如何将依赖名称视为等效。我假设其意图是使其也适用于未知专业的成员,因为目前在措辞中有一个漏洞(在模板声明中,你怎么知道 T::x 和 U::x 是等价的!?)
  • @KrystianS:这种情况无关紧要——T 和 U 的不同足以使它们不等价,即使调用的函数对于某些 T 和U.
  • @KrystianS:目前有一条规则:将此类类型与“expressions involving template parameters” 进行比较,因为类型名称不是表达式,所以这确实不令人满意。
猜你喜欢
  • 2015-02-27
  • 2015-01-25
  • 1970-01-01
  • 2021-09-03
  • 2017-12-02
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多