在当前的C ++标准(2019年3月)中,有以下两个段落(重点是我的):
假设在模板声明或模板中使用的依赖于模板参数的名称不命名类型,除非适用的名称查找找到类型名称,或者该名称由关键字类型名。 [...]
在查找模板定义中使用的名称的声明时,通常的查找规则([basic.lookup.unqual],[basic.lookup.argdep])用于非从属名称。取决于模板参数的名称的查找将推迟到知道实际模板参数([temp.dep])为止。 [...]
第一段暗示依赖于模板参数的名称将通过“适用名称查找”来查找。
但是,第二段指出,取决于模板参数的名称的查找将推迟到知道模板参数为止。
第一段中的示例包含与以下情况类似的情况:
template <typename T>
class A
{
void f()
{
T* p;
}
};
在方法f
中,我相信T
是“取决于模板参数的名称”,因此应将其查找推迟到知道T
为止,因此没有“适用名称”查找”,则应假定该名称未命名类型。
如果第二被引用的段落似乎表明没有执行查找,则第一被引用的段落的含义是“除非适用的名称查找找到类型名称”?我想念什么吗?
谢谢。
答案 0 :(得分:0)
推迟的查询是针对dependent names的:例如,在foo
或T::foo
之类的上下文中,Bar<T>::foo
或在{{ 1}}。显然,operator@
和T() @ 0
本身必须被查找,只是为了知道所涉及的模板参数(模板参数can be hidden)并解析模板参数列表。由于(类型)模板参数是typedef-name,而T
的任何特殊化都是类型,因此“名称查找将找到类型名称”。