C :使用声明和指令的顺序会影响选择
C++: Does the order of using declaration and directive affect the selection?
以下是示例代码
#include <iostream>
using namespace std;
namespace A {
void f() { cout << "a" << endl; }
}
namespace B {
void f() { cout << "b" << endl; }
}
namespace C {
using namespace A;
using namespace B;
using A::f;
}
namespace D {
using A::f;
using namespace A;
using namespace B;
}
int main()
{
C::f();
D::f();
}
当我尝试在Visual Studio 2015中尝试时,这两次是" A",这是由标准定义的,还是该实现特定的?
它是由标准定义的(这样的事物)。要意识到的关键是,您的各种using namespace
行对您的程序没有任何影响。
using namespace Foo
是"使用指令",它会影响范围内代码执行的名称查找。也就是说,如果您的namespace C {}
块中的某些功能试图找到一些名为foo
的对象,则A
和B
将是编译器搜索以找到foo
的地方。相比之下,如果以后的代码转介给C::foo
,则不会更改编译器的位置。单个块中两个连续using namespace
s的顺序无关紧要,因为每个块都具有完全效果直到块的末端。
您能够在C
或D
中找到f
的原因是"使用声明" using A::f
。与使用指导性不同的使用量化的效果是将名称注入范围,以便其他代码可以将名称称为该范围内的名称。
cppreference.com的以下两个段落应解释行为:
使用指导性[
using namespace A;
]不会在其出现的声明区域中添加任何名称(与使用declaration不同[using A::f;
]不同),因此不会阻止声明相同的名称。使用直接导演是为了无限制查找的目的是传递的:如果范围包含一个提名的指定性提名的名称空间名称,它本身包含对某些命名空间-name-2使用指示性的,那么效果就好像是一样使用第二个命名空间的指令显示在第一个名称空间。这些传递名称空间的顺序不会影响名称查找。
简单地说:using A::f;
好像您在此名称空间中声明了功能一样。using namespace A;
仅会导致打字机查找的行为,就像您的情况下的电流名称空间(C
或D
)一样,是A
中的名称空间。
这类似于
的方式namespace A {
void f() { cout << "a" << endl; }
namespace B {
void f() { cout << "b" << endl; }
}
}
和
namespace A {
namespace B {
void f() { cout << "b" << endl; }
}
void f() { cout << "a" << endl; }
}
是等效的。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 委派的 ctor 是否受参数计算顺序的影响?
- 影响初始化顺序(以C++为单位)
- 与任何算术操作员都会影响优化的恒定操作数顺序
- 添加字符串和文字,顺序如何影响是否可以正确添加字符串
- 联接线程如何影响主线程中的执行顺序?
- C :使用声明和指令的顺序会影响选择
- 文件范围的原子是否受初始化顺序惨败的影响
- 为什么继承顺序或映射会影响 vftable 的下标?(对于 VSC 表示C++)
- 继承顺序C++以何种方式影响构造函数
- 为什么 clang 编译器标志的顺序会影响生成的二进制大小
- 重载逗号操作符真的会影响其操作数的求值顺序吗?
- 为什么改变这些指令的顺序会显著影响性能
- 类属性的顺序会影响对象的大小吗?
- C++-为什么插入类型的顺序会影响Vector性能(GCC 4.81)