为什么regex_search不需要命名空间
Why regex_search does not require namespace
我试图理解为什么下面的代码在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有关的问题,你必须提供详细信息以获得更具体的答案。
相关文章:
- 有没有办法不使用命名空间中的项?
- 有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 如何在不使用命名空间标准的情况下取消设置ios::fixed
- 如何解决两个不使用命名空间的第三方库之间的类名冲突?
- 如何解决 comiler 错误:'v_bias'不是命名空间名称
- Typedef 不是命名空间的成员
- pahole 不显示命名空间中的类
- C++命名空间错误:不是命名空间的成员
- 在Qt4.8中使用不带命名空间的memcpy
- 在项目中移动了文件,现在我找不到命名空间
- 我的std::exchange不在命名空间std中
- C 为什么在类中可以使用循环依赖性,而不是命名空间或全局范围
- 使用<cstdint>带或不带命名空间的类型
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- 在不膨胀命名空间的情况下在C++中声明枚举的好方法
- C++:在函数参数列表中使用或不使用命名空间
- 为什么regex_search不需要命名空间
- 为什么遗留C标识符不需要命名空间std
- C++ getline() 不需要命名空间声明