C ++查找相关名称

时间:2019-03-20 16:34:30

标签: c++ templates language-lawyer

在当前的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为止,因此没有“适用名称”查找”,则应假定该名称未命名类型。

如果第二被引用的段落似乎表明没有执行查找,则第一被引用的段落的含义是“除非适用的名称查找找到类型名称”?我想念什么吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

推迟的查询是针对dependent names的:例如,在fooT::foo之类的上下文中,Bar<T>::foo或在{{ 1}}。显然,operator@T() @ 0本身必须被查找,只是为了知道所涉及的模板参数(模板参数can be hidden)并解析模板参数列表。由于(类型)模板参数是typedef-name,而T的任何特殊化都是类型,因此“名称查找将找到类型名称”。