为什么regex_search不需要命名空间

时间:2014-08-05 17:54:16

标签: c++ c++-standard-library

我试图理解为什么下面的代码在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是namespace std的一部分,但两个编译器都不需要std ::。为什么允许这样做?

1 个答案:

答案 0 :(得分:5)

该代码由于Argument Dependent Lookup而编译。由于参数是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相关的问题,则必须提供详细信息以获得更具体的答案。