ADL是否适用于全局命名空间
Does ADL work for the global namespace?
诸如启用std
类型输出的示例解释了如何使用ADL来"注入"特定的函数/操作符,这取决于fn/op应用的类型。
我想知道ADL是否完全适用于全局命名空间,也就是说,在全局命名空间范围内声明(或通过using
提供)的类型是否使ADL在全局命名空间中寻找匹配的函数?
具体来说,这些是等价的wrt吗?诽谤联盟吗?:
// 1 - at global namespace scope
struct GlobalType {};
template< class Ch, class Tr>
std::basic_ostream<Ch, Tr>& operator<<(std::basic_ostream<Ch, Tr>& os, GlobalType const& x)
{
os << ...;
return os;
}
// 2 - within namespace
namespace ecaps {
struct EcapsType {};
template< class Ch, class Tr>
std::basic_ostream<Ch, Tr>& operator<<(std::basic_ostream<Ch, Tr>& os, EcapsType const& x)
{
os << ...;
return os;
}
}
// 3 - Type brought to global NS via using, function at global scope
namespace other {
struct OtherType {};
}
using other::OtherType;
template< class Ch, class Tr>
std::basic_ostream<Ch, Tr>& operator<<(std::basic_ostream<Ch, Tr>& os, OtherType const& x)
{
os << ...;
return os;
}
关于。全局命名空间作用域不需要ADL:(在已删除的答案后更新)
委员会的Daniel krgler这样描述ADL问题:
此非限定调用具有非限定名称查找的效果发生,因此,编译器搜索name
operator<<
。的词法位置开始发现operator<<
调用"向上"(…)从当前命名空间和所有的包含该名称空间的名称空间(包括全局名称空间)
Emph。我的。注意外部命名空间是如何被描述为只考虑"…"从词法位置…"他继续说:
…作为第二条路线,它执行这个过程的第二阶段查找编译器在所谓的关联名称空间中进行搜索此调用中出现的实参类型。
在给出的示例中,搜索的第一阶段失败,原因是在
#include <iterator>
存在的地方,没有在任何命名空间中为这些参数类型对应operator<<
。注意,operator<<
的声明在之后以词法提供。operator<<
调用发生在某个地方的点库头文件。搜索的第二阶段也将考虑那些遵循实际的函数调用,但仅在关联的命名空间内。
大胆emph。我的。因此,在我看来,是相关的ADL为全局命名空间工作。当然,我很容易就误解了什么。
注意:这个可能是标准没有以这样或那样的方式明确提及它的一种情况,因为全局NS就像任何其他命名空间一样——然后它也可能不是,我对标准的了解非常有限。
完全忘记我最初的答案,这显然是错误的。
来自c++ 11标准,§3.4.2关于ADL(强调我的):
当函数调用(5.2.2)中的后缀表达式是unqualified-id,其他命名空间期间通常不考虑可以搜索非限定查找(3.4.1),并且在这些命名空间中,命名空间作用域友元函数声明(11.3)不是这样
所以简而言之,由于非限定查找总是在全局命名空间中搜索,ADL将永远不会应用于全局命名空间。
- 在命名空间中使用全局命名空间中的函数
- 类与命名空间的全局实例
- 将好友从模板导出到全局命名空间
- Catalina C++:使用<cmath>标头产生错误:全局命名空间中没有名为 'signbit' 的成员
- 将以"_[a-z0-9]"开头和"using"的标识符导入全局命名空间是否定义良
- C++从 std::async 函数读取命名空间中的全局变量标志
- 为什么不允许在全局命名空间处阻止范围?
- 如何在命名空间中声明外部全局,然后定义它?
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 我可以停止 GCC 将标准库名称包含在全局命名空间中吗?
- 在C 中将全局函数包括在命名空间中
- 为什么在全局范围以及命名空间std中定义了size_t
- 如何处理警告 C4177:#pragma 'float_control' 只能在全局范围或命名空间范围内使用
- "uintmax_t":不是"全局命名空间"的成员
- C++项目中的全局命名空间
- 使用 "::member" 引用全局命名空间有什么用吗?
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 命名空间中的全局变量会导致"undefined reference to"
- 在C 中重新解析命名空间内的全局类型
- 命名空间全局变量丢失值 (C++)