2015-11-02 16 views
5

Betrachten Sie die folgenden zwei using Aussagen:Unterschied zwischen verwenden und verwenden = für Typen?

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

Es scheint, dass nach den using, in beiden Richtungen ermöglichen es uns, die Verwendung MyType direkt (ohne Qualifier).

Also, was ist der Unterschied zwischen den beiden oben genannten?

+2

Nun, als Beispiel, kann der zweite Ausdruck verwendet werden, Aliasnamen wie 'using Foo = Bar ' auch zu definieren, während der erste nicht. Wie auch immer, im ersten Beispiel exportieren Sie einen bestehenden Namen, in der zweiten erstellen Sie einen neuen Alias. – skypjack

+0

Die erste ist eine [unter Verwendung Erklärung] (http://en.cppreference.com/w/cpp/language/namespace#Using-declarations), während der zweite A [Namensraum alias] ist (http: //en.cppreference .com/w/cpp/Sprache/Namespace_alias). – crayzeewulf

+0

@crayzeewulf wie der Titel der Frage erwähnt Typen, ich würde sagen, dass das zweite ist ein [Typ alias] (http://en.cppreference.com/w/cpp/language/type_alias) anstelle eines ns alias. – Christophe

Antwort

2

Wie gesagt im Kommentar, im ersten Fall Sie exportieren, tatsächlich einen Namen aus einem Namespace an die eine, die die using Erklärung enthält, während im zweiten Fall, dass Sie einen Aliasnamen im Namensraum definieren, den die using Anweisung enthält das verweist auf diesen bestimmten Namen und seinen umgebenden Namespace.

Als Beispiel mit dem zweiten Ausdruck Sie Aliase wie die folgenden definieren:

using Foo = Bar<MyClass>; 

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

Während der erste using Ausdruck kann nicht, es nur Namen zu lassen, dient als die, die in verschiedenen Räumen zur Verfügung stehen die sie enthalten.

Siehe here für weitere Details in Bezug auf Richtlinien verwenden, mit Erklärungen und Aliase (Art und Vorlage ist).

1

Mit dem ersten können Sie auf die Variable/den Typ durch seinen unqualifizierten Namen verweisen.

Der zweite Typ deklariert einen neuen Typ im umschließenden Namespace.

1

Neben skypjack ‚s nette Antwort, für die Datensätze, gibt es einen anderen Unterschied, wenn die statemetns innerhalb einer Klassendefinition verwendet werden.

innerhalb einer Klassendefinition, die unter Verwendung von Anmeldung ist ein Mitglied der Basisklasse einzuführen, während der Typ-Alias ​​noch ein Typ alias:

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

Sie sind absolut richtig, habe ich sie nicht auch in Betracht gezogen, wie in einer Klassendefinition in meiner Antwort eingeschlossen, meine Schuld. Vielen Dank. – skypjack

Verwandte Themen