在名称空间中搜索名称时是否有任何顺序
Is there any order when searching names in namespaces?
希望我不是在问一个愚蠢的问题。我确实在谷歌上搜索过,但没有找到太多信息。
我有以下简单的代码,引用自Herb Sutter的exception c++ Book Item 31:
namespace NS
{
class T{};
void f(T);
}
void f(NS::T);
int main()
{
NS::T params;
f(params);
}
当我编译它时:
prog.cpp: In function ' int main() ':
prog.cpp:12:13:错误:调用重载的' f(NS::T&) '是不明确的
Prog.cpp:12:13:注:候选人是:
prog.cpp:8:6: note: void f(NS::T)
prog.cpp:4:10: note: void NS::f(NS::T)
我理解这是因为f
的参数依赖查找。编译器发现两个版本的f
,一个在global命名空间,一个在NS
命名空间。
在多个名称空间中搜索名称时是否有任何顺序?
它应该总是搜索封闭命名空间,然后全局命名空间?
如果是这样的话,如果我们已经在
NS
命名空间中找到了匹配,为什么仍然存在歧义?
如果我的问题不清楚,请随时纠正我。
谢谢。
3.4.2.3 [basic.lookup。]argdep]似乎暗示ADL将在通常的非限定名称查找过程之后执行。
关于非限定名称查找的部分表明名称解析从最窄的范围开始并向外移动。
[ Example:
class B { };
namespace M {
namespace N {
class X : public B {
void f();
};
}
}
void M::N::X::f() {
i = 16;
}
// The following scopes are searched for a declaration of i:
// 1) outermost block scope of M::N::X::f, before the use of i
// 2) scope of class M::N::X
// 3) scope of M::N::X’s base class B
// 4) scope of namespace M::N
// 5) scope of namespace M
// 6) global scope, before the definition of M::N::X::f
—end example ]
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如果 RMW 操作没有任何变化,是否可以针对所有内存顺序对其进行优化
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 有没有办法在不使用任何迭代的情况下将字符的字母顺序排列
- 检查两个 Boost.MPL 序列是否按任何顺序包含相同的类型
- 与任何算术操作员都会影响优化的恒定操作数顺序
- 保存对象并以任何特定顺序加载它们
- 如何在不放置任何物理依赖项的情况下指定生成文件目标生成顺序
- 使用boost::spirit以任何顺序解析命名参数
- 任何矩阵库顺序无关
- 在名称空间中搜索名称时是否有任何顺序
- 在类型演绎之后,函数模板中的替换顺序是否有任何保证
- 是否有任何标准的包含顺序来避免隐藏的依赖关系
- 在将参数传递给类的构造函数的顺序中是否有任何协议或同意?