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