2015-11-02 50 views
5

考虑以下两个using声明:使用和使用=之间的差异类型?

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

看来,using后,两种方式可以让我们使用MyType直接(不加任何修饰词)。

那么上述两者有什么区别?

+2

好了,作为一个例子,所述第二表达可用于定义别名,如'使用Foo = Bar ',而第一个不能。无论如何,在第一个例子中,您正在导出一个现有名称,在第二个例子中,您正在创建一个新的别名。 – skypjack

+0

第一个是[使用声明](http://en.cppreference.com/w/cpp/language/namespace#Using-declarations),而第二个是[namespace alias](http://en.cppreference .COM/W/CPP /语言/ namespace_alias)。 – crayzeewulf

+0

@crayzeewulf作为问题的标题提及类型,我会说第二个是[类型别名](http://en.cppreference.com/w/cpp/language/type_alias)而不是ns别名。 – Christophe

回答

2

正如评论所说,在第一种情况下,你实际上是从一个命名空间包含了using声明的一个出口的名称,而在第二种情况下,你要定义在命名空间包含using声明的别名指向该特定名称及其周围的名称空间。

作为一个例子,与第二个表达式可以定义别名,如下列之一:

using Foo = Bar<MyClass>; 

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

虽然第一using表达不了,它仅仅用来让名在不同的空间比那些可用包含它们。

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

1

第一个让你引用变量/类型的不合格的名称。

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

1

除了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; 
}; 
+0

你是绝对正确的,在我的回答中,我没有把他们看作是我的错误。谢谢。 – skypjack

相关问题