C 查找因名称

C++ lookup for dependent names

本文关键字:查找      更新时间:2023-10-16

在当前的C 标准(2019年3月)中,有这两个段落(重点是我的):

[temp.res] p.2:

模板声明或定义中使用的名称,并且假定取决于模板参数的名称不为不是命名类型>关键字TypeName。[...]

[temp.res] p.9:

在寻找模板定义中使用的名称的声明时,通常使用通常的查找规则([basic..lookup.unqual],[basic.lookup.argdep])用于非依赖性名称。依赖于模板参数的名称的查找被推迟,直到已知实际模板参数([temp.dep])。[...]

第一段意味着取决于模板参数的名称将通过"适用的名称查找"查找。

但是,第二段指出,依赖于模板参数的名称的查找被推迟到模板参数为止。

第一段的示例包括类似于以下情况的情况:

template <typename T>
class A
{
    void f()
    {
        T* p;
    }
};

在方法f中,我相信 T是"依赖模板参数的名称",因此应将其查找推迟到已知T之前,因此没有"适用的名称查找",应假定名称不命名一个名称类型。

如果第二个引用的段落似乎没有执行查找,则第一个引用的段落是什么意思是"除非适用的名称查找找到类型名称",否则该段落是什么意思?我想念什么吗?

谢谢。

推迟的查找是用于依赖的名称:例如,在诸如T::fooBar<T>::foo之类的上下文中的fooT() @ 0等上下文中的operator@。显然,TBar必须自己查找,只是要知道涉及模板参数(模板参数可以隐藏)并解析模板参数列表。由于(类型)模板参数为a typedef-name ,并且Bar的任何专业化都是一种类型,因此"名称查找找到类型名称"。