类型的using和using=之间的区别

Difference between using and using = for types?

本文关键字:using 区别 之间 类型      更新时间:2023-10-16

考虑以下两个using语句:

using ::space1::space2::MyType;
using MyType = ::space1::space2::MyType;

似乎在using之后,这两种方式都允许我们直接使用MyType(没有任何限定符)。

那么,以上两者之间有什么区别呢?

如注释中所述,在第一种情况下,您实际上是将名称从命名空间导出到包含using声明的命名空间,而在第二种情况中,您在包含指向该特定名称及其周围命名空间的using声明的命名空间中定义了一个别名。

例如,使用第二个表达式,您可以定义如下别名:

using Foo = Bar<MyClass>;
template <class C>
using Foo = Bar<C, MyClass>;

虽然第一个using表达式不能,但它只是让名称在与包含它们的空间不同的空间中可用。

有关使用指令、使用声明和别名(类型和模板)的更多详细信息,请参阅此处。

第一个允许您通过其非限定名称来引用变量/类型。

第二个在封闭命名空间中声明了一个新的类型名称。

除了skypjack的好答案之外,对于记录,在类定义中使用statemetn还有另一个区别。

在类定义中,using声明应引入基类的一个成员,而类型别名仍然是类型别名:

namespace space1 {  namespace space2 {  class MyType {}; } }
struct s1  {
    using ::space1::space2::MyType;  // error 
    MyType b; 
};
struct s2 {
    using MyType = ::space1::space2::MyType;  // perfectly valid
    MyType a; 
};