2015-11-02 13 views
5

considerare le seguenti due affermazioni using:Differenza tra utilizzo e utilizzo = per i tipi?

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

Sembra che dopo il using, in entrambi i sensi ci permette l'utilizzo MyType direttamente (senza qualificazioni).

Quindi qual è la differenza tra i due precedenti?

+2

Ebbene, come esempio, la seconda espressione può essere usata per definire alias come 'using Foo = Bar ', mentre il primo non può. Ad ogni modo, nel primo esempio si sta esportando un nome esistente, nel secondo si sta creando un nuovo alias. – skypjack

+0

Il primo è un [using declaration] (http://en.cppreference.com/w/cpp/language/namespace#Using-declarations) mentre il secondo è un [alias namespace] (http: //en.cppreference .com/w/cpp/lingua/namespace_alias). – crayzeewulf

+0

@crayzeewulf come il titolo della domanda menziona i tipi, direi che il secondo è un [tipo alias] (http://en.cppreference.com/w/cpp/language/type_alias) piuttosto che un alias ns. – Christophe

risposta

2

Come detto nel commento, nel primo caso, in realtà si sta esportando un nome da uno spazio dei nomi a quella che contiene la dichiarazione using, mentre nel secondo caso si sta definendo un alias nello spazio dei nomi che contiene la dichiarazione using che punta a quel nome specifico e al suo spazio dei nomi circostante.

A titolo di esempio, con la seconda espressione è possibile definire gli alias come la seguente:

using Foo = Bar<MyClass>; 

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

Mentre il primo using espressione non può, ma serve solo a far nomi siano disponibili in spazi diversi rispetto a quelli che li contengono

Vedere here per ulteriori dettagli sull'utilizzo delle direttive, utilizzo di dichiarazioni e alias (tipo e modello).

1

Il primo consente di fare riferimento alla variabile/tipo tramite il nome non qualificato.

Il secondo dichiara un nome di tipo nuovo nello spazio dei nomi incluso.

1

In aggiunta alla bella risposta di skypjack, per i record, c'è un'altra differenza quando le statemi sono utilizzate all'interno di una definizione di classe.

All'interno di una definizione di classe, la dichiarazione using membri introducono un membro della classe base, mentre, il tipo alias è ancora un tipo 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

Hai assolutamente ragione, non li ho considerati anche racchiusi in una definizione di classe nella mia risposta, colpa mia. Grazie. – skypjack

Problemi correlati