Ricerca…


introduzione

Una dichiarazione using introduce un singolo nome nello scope corrente precedentemente dichiarato altrove.

Sintassi

  • usando typename ( opt ) nested-name-specifier unqualified-id ;
  • usando :: id non qualificato ;

Osservazioni

Una dichiarazione d'uso è distinta da una direttiva using , che dice al compilatore di cercare in uno spazio dei nomi particolare quando cerca un nome qualsiasi . Una direttiva using namespace inizia con l' using namespace .

Una dichiarazione d'uso è anche distinta da una dichiarazione di alias, che dà un nuovo nome ad un tipo esistente allo stesso modo di typedef . Una dichiarazione alias contiene un segno di uguale.

Importazione di nomi individuali da uno spazio dei nomi

Una volta using viene utilizzato per introdurre il nome cout dallo spazio dei nomi std nello scope della funzione main , l'oggetto std::cout può essere indicato come cout alone.

#include <iostream>
int main() {
    using std::cout;
    cout << "Hello, world!\n";
}

Riconoscere i membri di una classe base per evitare l'occultamento del nome

Se una dichiarazione di utilizzo si verifica nell'ambito della classe, è consentito solo ridichiarare un membro di una classe base. Ad esempio, l' using std::cout non è consentito nell'ambito della classe.

Spesso, il nome redeclared è uno che altrimenti sarebbe nascosto. Ad esempio, nel codice seguente, d1.foo fa riferimento solo a Derived1::foo(const char*) e si verificherà un errore di compilazione. La funzione Base::foo(int) è nascosta e non viene considerata affatto. Tuttavia, d2.foo(42) va bene perché la dichiarazione using porta Base::foo(int) nell'insieme di entità denominate foo in Derived2 . Nome ricerca trova quindi sia foo s e la risoluzione di sovraccarico seleziona Base::foo .

struct Base {
    void foo(int);
};
struct Derived1 : Base {
    void foo(const char*);
};
struct Derived2 : Base {
    using Base::foo;
    void foo(const char*);
};
int main() {
    Derived1 d1;
    d1.foo(42);  // error
    Derived2 d2;
    d2.foo(42);  // OK
}

Costruttori ereditari

C ++ 11

Come caso speciale, una dichiarazione di utilizzo nell'ambito della classe può fare riferimento ai costruttori di una classe di base diretta. Questi costruttori vengono quindi ereditati dalla classe derivata e possono essere utilizzati per inizializzare la classe derivata.

struct Base {
    Base(int x, const char* s);
};
struct Derived1 : Base {
    Derived1(int x, const char* s) : Base(x, s) {}
};
struct Derived2 : Base {
    using Base::Base;
};
int main() {
    Derived1 d1(42, "Hello, world");
    Derived2 d2(42, "Hello, world");
}

Nel codice precedente, sia Derived1 che Derived2 hanno costruttori che inoltrano gli argomenti direttamente al costruttore corrispondente di Base . Derived1 esegue esplicitamente l'inoltro, mentre Derived2 , utilizzando la funzione C ++ 11 dei costruttori ereditari, lo fa in modo implicito.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow