为什么regex_search不需要命名空间

Why regex_search does not require namespace

本文关键字:不需要 命名空间 search regex 为什么      更新时间:2023-10-16

我试图理解为什么下面的代码在VS2012和GCC 4.8.3中编译没有问题:

#include <iostream>
#include <regex>
int main(int argc, char** argv)
{
    std::wregex brackets_regex(L"");
    std::wcmatch bracket_match;
    wchar_t expr[80] = L"";
    regex_search(expr, bracket_match, brackets_regex);
}

据我所知,regex_search是命名空间std的一部分,但是两个编译器都不需要std::。为什么这是允许的?

由于参数依赖查找而编译。由于参数的类型来自std名称空间,因此该名称空间被标记为"关联的名称空间",并且名称解析考虑来自该名称空间的候选名称。

这会导致boost和STD名称空间之间的问题吗?

它可能会产生歧义,从而导致错误。

namespace A {
    struct AA {};
}
namespace B {
    struct BB {};
    void foo(A::AA, BB) {}
}
namespace A {
    void foo(AA, B::BB) {}
}
int main()
{
    A::AA a;
    B::BB b;
    foo(a, b);
}

我也认为一些编译器可能不正确地实现它,特别是在与两阶段查找相结合时,导致编译错误格式的代码或无法编译正确的代码,甚至将名称解析为错误的实体。

如果你遇到一个你认为可能与ADL有关的问题,你必须提供详细信息以获得更具体的答案。