【问题标题】:Dependent qualified name lookup in C++14C++14 中的从属限定名查找
【发布时间】:2015-01-06 06:11:43
【问题描述】:

这是关于模板函数中的依赖名称查找,例如:

template<class T>
void foo(T const &t)
{
    ::func(t);
}

在此代码中,func 是一个依赖名称,因为它有一个依赖于类型的表达式作为函数调用的参数。在 C++11 中,func 的查找由 [temp.dep.candidate]/1:

对于依赖于模板参数的函数调用,使用通常的查找规则(3.4.1、3.4.2、3.4.3)找到候选函数,除了:

  • 对于使用非限定名称查找 (3.4.1) 或限定名称查找 (3.4.3) 的查找部分,只能找到来自模板定义上下文的函数声明。
  • 对于使用关联命名空间 (3.4.2) 的查找部分,只能找到在模板定义上下文或模板实例化上下文中找到的函数声明。

[注意:3.4.1 是“普通”的非限定 ID 查找,而 3.4.2 是函数名称的非限定 ID 查找,又名。 ADL,而 3.4.3 是qualified-id lookup]。

但是在 C++14 (N3936) 中,关于 qualified-id 查找的部分被删除了:

对于 后缀表达式 是依赖名称的函数调用,使用通常的查找规则(3.4.1、3.4.2)找到候选函数,除了:

  • 对于使用非限定名称查找 (3.4.1) 的查找部分,只能找到来自模板定义上下文的函数声明。
  • 对于使用关联命名空间 (3.4.2) 的查找部分,只能找到在模板定义上下文或模板实例化上下文中找到的函数声明。

假设此更改是故意进行的;哪些子句现在涵盖为后缀表达式是依赖名称和限定 ID 的函数调用寻找候选函数?

(背景:我正在寻找确认限定名称查找仍然只在模板定义上下文中查找,而不是在实例化上下文中查找)。

【问题讨论】:

  • C++14 你用的是哪个草稿,b/c N3936 不是这样读的。
  • 能否也提供该草稿的链接?
  • @ShafikYaghmour 已修复。我以为我会复制粘贴以避免再次进行所有引用/要点格式化,但把它弄得一团糟

标签: c++ templates language-lawyer c++14 overload-resolution


【解决方案1】:

缺陷报告1321 已被最新的 C++14 草案 (N4140) 接受。该缺陷报告阐明了从属名称的等效性,同时阐明了从属名称必须是 unqualified-id。以前,在 C++11 中,依赖名称可以是任意的 id-expressions。

这意味着 qualified-id 名称不再是从属名称,因此根据 §14.6.3 [temp.nondep] 进行查找。这实际上不会影响 C++11 中的程序行为,因为依赖名称仅影响是否使用模板实例化上下文执行 ADL(第 3.4.2 节),并且只有 unqualified-id 符合条件无论如何,对于 ADL。

【讨论】:

猜你喜欢
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多