考虑以下两个using
声明:使用和使用=之间的差异类型?
using ::space1::space2::MyType;
using MyType = ::space1::space2::MyType;
看来,using
后,两种方式可以让我们使用MyType
直接(不加任何修饰词)。
那么上述两者有什么区别?
考虑以下两个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
表达不了,它仅仅用来让名在不同的空间比那些可用包含它们。
有关使用指令的详细信息,请参阅here,使用声明和别名(类型和模板)。
第一个让你引用变量/类型的不合格的名称。
第二个在封闭名称空间中声明新的类型名称。
除了skypjack的很好的答案,对于记录来说,statemetns在类定义中使用时还有另一个区别。
里面一个类的定义,使用声明应引进的基类的一个成员,而,该类型别名仍是一个类型别名:
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;
};
你是绝对正确的,在我的回答中,我没有把他们看作是我的错误。谢谢。 – skypjack
好了,作为一个例子,所述第二表达可用于定义别名,如'使用Foo = Bar',而第一个不能。无论如何,在第一个例子中,您正在导出一个现有名称,在第二个例子中,您正在创建一个新的别名。 –
skypjack
第一个是[使用声明](http://en.cppreference.com/w/cpp/language/namespace#Using-declarations),而第二个是[namespace alias](http://en.cppreference .COM/W/CPP /语言/ namespace_alias)。 – crayzeewulf
@crayzeewulf作为问题的标题提及类型,我会说第二个是[类型别名](http://en.cppreference.com/w/cpp/language/type_alias)而不是ns别名。 – Christophe