我试图理解为什么下面的代码在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有关,则必须提供详细信息以获得更具体的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句