通过使用其他名称空间元素传播的名称空间外部可见性
visibility outside namespace propagated by usage of other namespace elements
看一下这个简单的代码片段:
namespace Test
{
struct A {};
void foo( A _a ) {}
}
int main( int, char** )
{
foo( Test::A() ); // 1. why foo doesn't require Test:: ?
Test::foo( A() ); // 2. why A() requires Test:: considering above line?
return 0;
}
如来源所述:
-
foo( Test::A() );
为什么foo
在这里不需要Test::
? -
Test::foo( A() );
为什么A()
需要Test::
考虑上面的行?
(Visual Studio 2008和gcc4.8给出相同的结果,所以我想这是标准的行为,但我想知道标准的哪一部分定义它?)
这是依赖于参数的名称查找,又名Koenig查找(尽管Andrew Koenig并没有发明它)。它在标准的同名章节中定义。
它支持如下操作:
std::string str( "Hello world!" );
std::cout << str;
重载operator<<( std::ostream &, std::string )
位于std::
命名空间中——如果没有ADL, 将无法找到。
对于在其参数的命名空间中查找的函数,只能起作用,而不是反过来(示例2),这将进一步削弱命名空间障碍,而没有与案例1相比的好处。
在这里有更深入的讨论
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 是否可以将函数导入命名空间,但不能导出它?
- 通过使用其他名称空间元素传播的名称空间外部可见性