【发布时间】:2020-10-09 06:02:57
【问题描述】:
关于如何查找模板的依赖名称,标准只给出了这样的一小句话,没有更多:
在解析从属名称时,会考虑来自以下来源的名称:
- 在模板定义点可见的声明。
- 来自与函数参数类型关联的命名空间的声明,来自实例化上下文 ([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 是一个模板参数,所以查找动作应该在给定模板参数之后发生,即在实例化一个这种模板的专业化。但我引用的引文并没有说明这一点。所以,我想知道这是标准中的缺陷吗?如果我遗漏了标准中对此进行解释的任何内容,请在此问题中引用它们。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: templates c++17 language-lawyer