C :使用声明和指令的顺序会影响选择

C++: Does the order of using declaration and directive affect the selection?

本文关键字:顺序 影响 选择 指令 声明      更新时间:2023-10-16

以下是示例代码

#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的对象,则AB将是编译器搜索以找到foo的地方。相比之下,如果以后的代码转介给C::foo,则不会更改编译器的位置。单个块中两个连续using namespace s的顺序无关紧要,因为每个块都具有完全效果直到块的末端。

您能够在CD中找到f的原因是"使用声明" using A::f。与使用指导性不同的使用量化的效果是将名称注入范围,以便其他代码可以将名称称为该范围内的名称。

cppreference.com的以下两个段落应解释行为:

使用指导性[using namespace A;]不会在其出现的声明区域中添加任何名称(与使用declaration不同[using A::f;]不同),因此不会阻止声明相同的名称。

使用直接导演是为了无限制查找的目的是传递的:如果范围包含一个提名的指定性提名的名称空间名称,它本身包含对某些命名空间-name-2使用指示性的,那么效果就好像是一样使用第二个命名空间的指令显示在第一个名称空间。这些传递名称空间的顺序不会影响名称查找。

简单地说:using A::f;好像您在此名称空间中声明了功能一样。using namespace A;仅会导致打字机查找的行为,就像您的情况下的电流名称空间(CD)一样,是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; }
}

是等效的。