【问题标题】:Argument dependent lookup for classes in top-level namespace?顶级命名空间中类的参数依赖查找?
【发布时间】:2014-05-12 07:45:12
【问题描述】:

由于历史原因,我有一个位于顶级命名空间中的类。我需要为它定义一个必须1 使用参数相关查找找到的函数。顶级命名空间是否被视为此类的关联命名空间,还是我必须采取一些解决方法?

1否则使用它的模板可能找不到它,因为在模板之后定义的符号只有在被 ADL 找到时才能看到。

【问题讨论】:

  • 为什么需要在全局命名空间中对函数进行依赖参数的查找?
  • @ChrisDrew 我相信这在脚注中有解释。
  • @Angew:我明白了。为什么不能在模板之前声明函数有充分的理由吗?
  • @ChrisDrew 我会这么说,因为它需要以特定顺序包含头文件,而这是您在任何非平凡项目中必须避免的事情大小。
  • @ChrisDrew:它是独立类型,需要实现一个概念。试图规定包含顺序会导致一团糟。

标签: c++ c++03 argument-dependent-lookup


【解决方案1】:

全局命名空间在这方面并不特殊,它就像任何其他命名空间一样工作,因此非常适合您的用例。

Live example 1 的全局命名空间工作。

Live example 2 的 ADL 实际上是 #1 起作用的原因1。

这是现场示例的文本:

#include <iostream>

struct X {};

template <class T>
void bar(T t)
{
  foo(t);
}

void foo(X x)
{
  std::cout << "Foo\n";
}

int main()
{
  X x;
  bar(x);
}

1 这会失败,因为 ADL 找不到函数,而正常查找会。因此,它证明了 #1 确实有效,这要归功于 ADL。

【讨论】:

  • @Rapptz 哪一个?第二个应该失败。
【解决方案2】:

这是我对标准的看法:

来自 [basic.lookup.argdep] (2):

——如果 T 是一个类类型(包括联合),它的关联类是: 班级本身;它所属的类别(如有的话);及其 直接和间接基类。其关联的命名空间是 其关联类的最内层封闭命名空间。

来自 [basic.namespace] (2)(以及定义 global namespace 的 3.3.6):

翻译单元的最外层声明区域是命名空间;见 3.3.6。

所以我看不到任何东西可以从 ADL 中排除全局命名空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多