对类型使用和使用 = 之间的区别?
Difference between using and using = for types?
考虑以下两个 using
语句:
using ::space1::space2::MyType;
using MyType = ::space1::space2::MyType;
似乎在using
之后,这两种方式都允许我们直接使用MyType
(没有任何限定符)。
那么以上两者有什么区别呢?
第一个让您可以通过 不合格的 名称来引用 variable/type。
第二个在封闭的命名空间中声明了一个 new 类型名称。
如评论中所述,在第一种情况下,您实际上是将名称从命名空间导出到包含 using
声明的名称,而在第二种情况下,您是在命名空间中定义别名其中包含指向该特定名称及其周围命名空间的 using
语句。
例如,使用第二个表达式,您可以定义别名,如下所示:
using Foo = Bar<MyClass>;
template <class C>
using Foo = Bar<C, MyClass>;
虽然第一个 using
表达式不能,但它仅用于让名称在与包含它们的空间不同的空间中可用。
有关使用指令、使用声明和别名(类型和模板)的更多详细信息,请参见here。
除了 skypjack 的好答案之外,作为记录,当在 class 定义中使用 statemetns 时,还有另一个区别。
在 class 定义中,using 声明应引入基 class 的成员,而类型别名仍然是类型别名:
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;
};
考虑以下两个 using
语句:
using ::space1::space2::MyType;
using MyType = ::space1::space2::MyType;
似乎在using
之后,这两种方式都允许我们直接使用MyType
(没有任何限定符)。
那么以上两者有什么区别呢?
第一个让您可以通过 不合格的 名称来引用 variable/type。
第二个在封闭的命名空间中声明了一个 new 类型名称。
如评论中所述,在第一种情况下,您实际上是将名称从命名空间导出到包含 using
声明的名称,而在第二种情况下,您是在命名空间中定义别名其中包含指向该特定名称及其周围命名空间的 using
语句。
例如,使用第二个表达式,您可以定义别名,如下所示:
using Foo = Bar<MyClass>;
template <class C>
using Foo = Bar<C, MyClass>;
虽然第一个 using
表达式不能,但它仅用于让名称在与包含它们的空间不同的空间中可用。
有关使用指令、使用声明和别名(类型和模板)的更多详细信息,请参见here。
除了 skypjack 的好答案之外,作为记录,当在 class 定义中使用 statemetns 时,还有另一个区别。
在 class 定义中,using 声明应引入基 class 的成员,而类型别名仍然是类型别名:
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;
};