C++中的关键字"using"可以与"namespace"以外的内容一起使用吗?

Can the keyword "using" in C++ be used with something except of "namespace"?

本文关键字:一起 关键字 using namespace C++      更新时间:2023-10-16
关键字

using in C++可以与关键字命名空间以外的其他内容一起使用吗?如果没有 - 那么为什么我们不能简单地写"命名空间..."?如果是 - 请您举例说明它在"非命名空间"上下文中的用法吗?

谢谢。

关键字using有多种不同的用途:

  1. 您可以声明命名空间中的所有名称都不需要带有 using 指令的命名空间前缀,例如 using namespace std .
  2. 您可以声明命名空间的特定成员不需要带有 using 声明的命名空间前缀,例如 using std::vector .
  3. 您可以声明基类的成员函数不应隐藏在派生类中,例如,using B::f; B是基类,f是该基类的可能重载成员。
  4. 您可以声明基类的构造函数应继承,例如using B::B; .
  5. 您可以绑定模板参数并为模板命名或将其用于别名类型,例如 template <typename T> using singleton = std::pair<int, T>; .

是的,您可以using一个名称。例如

using std::swap;
仅对从

命名空间std swap执行"使用",而

using namespace std;

拉入 STD 中的每个名称。

是的。它用于声明命名空间成员。例如:

namespace homebrew
{
   template<typename T>
   struct vector {};
}
int main()
{
    {
        using namespace std;
        vector<T> v; //Refers to std::vector
    }
    {
        using homebrew::vector;
        vector<T> v; //Refers to homebrew::vector
    }
}

也用于对类成员执行相同的操作:

#include <iostream>
struct B {
    virtual void f(int) { std::cout << "B::fn"; }
    void g(char)        { std::cout << "B::gn"; }
    void h(int)         { std::cout << "B::hn"; }
 protected:
    int m; // B::m is protected
    typedef int value_type;
};
struct D : B {
    using B::m; // D::m is public
    using B::value_type; // D::value_type is public
    using B::f;
    void f(int) { std::cout << "D::fn"; } // D::f(int) overrides B::f(int)
    using B::g;
    void g(int) { std::cout << "D::gn"; } // both g(int) and g(char) are visible
                                           // as members of D
    using B::h;
    void h(int) { std::cout << "D::hn"; } // D::h(int) hides B::h(int)
};

最后,它自 C++11 以来用于定义类型别名,包括模板别名:

using vector_of_bool = std::vector<bool>;
template<typename T>
using vector_t = std::vector<T>;

这些示例摘自有关using关键字的 cppreference.com 文档。