ADL 是否适用于全局命名空间?

2024-04-10

Examples https://stackoverflow.com/a/5076640/321013 such as https://groups.google.com/forum/#!original/comp.lang.c++.moderated/1Qz71aFnXlI/Gd71gwRaWssJ启用输出std类型解释如何ADL http://en.wikipedia.org/wiki/Argument-dependent_name_lookup可用于“注入”某个函数/运算符,具体取决于 fn/op 所应用的类型。

我想知道 ADL full 是否适用于全局命名空间,即是否声明了类型(或通过using) at 全局命名空间范围 https://stackoverflow.com/a/10269085/321013让 ADL 在全局命名空间中寻找匹配的函数?

具体来说,这些是等价的。日常活动能力?:

// 1 - at global namespace scope
struct GlobalType {};

template< class Ch, class Tr>
std::basic_ostream<Ch, Tr>& operator<<(std::basic_ostream<Ch, Tr>& os, GlobalType const& x)
{
    os << ...;
    return os;
} 

// 2 - within namespace
namespace ecaps {

    struct EcapsType {};

    template< class Ch, class Tr>
    std::basic_ostream<Ch, Tr>& operator<<(std::basic_ostream<Ch, Tr>& os, EcapsType const& x)
    {
        os << ...;
        return os;
    } 

}

// 3 - Type brought to global NS via using, function at global scope
namespace other {
    struct OtherType {};    
}

using other::OtherType;

template< class Ch, class Tr>
std::basic_ostream<Ch, Tr>& operator<<(std::basic_ostream<Ch, Tr>& os, OtherType const& x)
{
    os << ...;
    return os;
} 

沃特。不需要 ADL 的全局命名空间范围:(在现已删除的答案后更新)

One 委员会名人 Daniel Krügler 描述了 ADL 问题 https://groups.google.com/forum/#!original/comp.lang.c++.moderated/1Qz71aFnXlI/Gd71gwRaWssJ像这样:

此非限定调用具有非限定名称查找的效果 发生这种情况,因此编译器会搜索 姓名operator<<。开始从词汇位置operator<<发现呼叫“向上”(...) 从当前命名空间开始并且所有 包含该命名空间的命名空间(包括全局 命名空间,顺便说一句。)和 - ...

强调。矿。请注意外部名称空间如何被描述为仅被视为“...从词汇位置...“。 他继续:

...并且 - 作为第二条路线 - 它执行此的第二阶段 编译器在所谓的关联命名空间中进行查找 此调用中出现的参数类型。

在所提供的示例中,搜索的第一阶段失败,因为 在这一点上#include <iterator>存在,不存在 相应的operator<<对于任何命名空间中的这些参数类型。 请注意,您的声明operator<<按词汇提供after的调用点operator<<发生在某些地方 库头。第二阶段的搜寻工作还将 考虑地点follow实际的函数调用,但仅限于关联的命名空间内。

大胆强调。矿。所以在我看来is与 ADL 适用于全局命名空间相关。当然,我很容易误解一些东西。


注:这个may是标准的一种情况,只是没有以某种方式明确提及它,因为全局 NS 就像任何其他命名空间一样——但也可能不是,我对标准的了解非常有限。


完全忘记我最初的答案,这完全是错误的。

来自 C++11 标准,ADL 的 §3.4.2(强调我的):

当函数调用 (5.2.2) 中的后缀表达式是 unqualified-id,其他命名空间平时不考虑 不合格的查找(3.4.1) 可以被搜索,并且在这些命名空间中, 命名空间范围的友元函数声明 (11.3) 不然的话 可见可以发现。

简而言之,由于不合格的查找将始终在全局命名空间中搜索,ADL 将never应用于全局命名空间.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ADL 是否适用于全局命名空间? 的相关文章

  • ASP MVC4 - 通过视图模型传递列表以查看

    我有一个模型人物 其中包括出生日期等字段 我想将所有人的列表以及每个人的计算年龄传递给视图 因此 视图模型 public class vm PersonList public Person Person get set public int
  • lambda 始终返回“1”

    有这样的代码 include
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • 将整数四舍五入到最接近的 10 倍数[重复]

    这个问题在这里已经有答案了 我想弄清楚如何对价格进行四舍五入 双向 例如 Round down 43 becomes 40 143 becomes 140 1433 becomes 1430 Round up 43 becomes 50 1
  • 从文本文件中读取所有内容 - C

    我正在尝试从文本文件中读取所有内容 这是我写的代码 include
  • 如何使构造函数只能由基类访问?

    如果我想要一个只能从子类访问的构造函数 我可以使用protected构造函数中的关键字 现在我想要相反的 我的子类应该有一个构造函数 该构造函数可以由其基类访问 但不能从任何其他类访问 这可能吗 这是我当前的代码 问题是子类有一个公共构造函
  • 返回 ObjectResult 会导致 406 Not Acceptable

    在学习 Scott Allen 的 Pluralsight 课程 Asp net Core 1 0 基础知识 时 在 MVC 框架中的控制器 模块和 操作结果 部分中 我在 Index 操作方法上遇到了 406 Not Acceptable
  • 如何从 UNC 中提取服务器名称

    谁能告诉我如何从 UNC 中提取服务器名称 ex 服务器名称 目录 目录 编辑 我很抱歉 但看起来我需要澄清一个错误 路径实际上更像是 服务器名 d 目录 我知道这可能会改变一些事情 怎么样Uri Uri uri new Uri serve
  • 如何获取字符串宽度

    我需要在类库中构建一个函数 该函数接受一个字符串和该字符串的特定字体 然后获取字符串的宽度 那么我怎样才能得到字符串边界宽度呢 另一种方法是使用TextRenderer 并致电its MeasureString http msdn micr
  • Python NET 调用具有返回值和输出参数的 C# 方法

    我有以下静态 C 方法 public static bool TryParse string s out double result 我想使用 Python NET 包从 Python 调用它 import clr from System
  • 从网站保存嵌入的 pdf

    我正在编写一个小型 C 应用程序来管理供应商提供的 化学品 安全数据表 目前 我手动搜索该化学品并保存 pdf 并在我的程序中添加指向 pdf 的链接 问题是我还有很多化学品需要处理 所以最好将过程自动化 例如 化学品的部件号如下 2710
  • 策略模式的现实示例

    我一直在读关于OCP原理 http en wikipedia org wiki Open closed principle以及如何使用策略模式来实现这一目标 我打算尝试向几个人解释这一点 但我能想到的唯一例子是根据 订单 的状态使用不同的验
  • 在 QtCreator 中查看数组内容

    调试时是否可以在 Qt Creator 中查看数组的内容 似乎检测到我的数组是一个数组而不是一个指针 此外 我可以点击一个箭头 就像展开一样 但之后什么也没有显示 当我试穿的时候std vector Qt Creator 设法按预期显示内容
  • 在 Winforms 中,PreviewKeyDown() 从未针对任何键触发

    我最初试图让我的程序获取箭头键 上 下 左 右 的输入 但发现在 KeyDown 中这些键从未出现过 后来我发现我可以通过进入 PreviewKeyDown 函数并设置来启用箭头键 e IsInputKey true 及其周围的任何条件和逻
  • 如何将焦点设置到 Windows 窗体应用程序中的控件?

    在 Windows 窗体应用程序中 when我是否编写代码以在应用程序启动时以及随后调用函数后将焦点设置到控件 例如 如果我有一个 DropDownList 一个 TextBox 和四个按钮 并且我希望将 Focus 设置为 DropDow
  • gcc总是做这种优化吗? (公共子表达式消除)

    作为示例 假设表达式sys gt pot atoms item gt P kind mass在循环内求值 循环只改变item 因此表达式可以简化为atoms item gt P kind mass通过将变量定义为atoms sys gt p
  • C# - 使用 Linq 获取 Attribute 的属性

    我有一个属性 它本身就有属性 我想访问这些属性之一 布尔值 并检查它是否正确 我能够检查属性是否已设置 但这就是全部 至少对于 linq 来说是这样 属性 public class ImportParameter System Attrib
  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • 如何检查多个变量是否等于同一值?

    如何比较多个项目 例如 我希望检查所有变量 A B 和 C 是否都等于字符 X 或所有三个变量都等于 O 如果其中 2 个为 X 1 个为 O 则应返回 false I tried if A B C X A B C O Do whateve
  • 通过 boost::python 将 C++ 对象传递给 python 函数

    我想在 C 应用程序中使用嵌入 python 并调用 python 脚本中定义的函数 该函数的参数是一个 C 对象 看我的代码 class Test public void f std cout lt lt sss lt

随机推荐