Поиск…


Вступление

Объявление using вводит одно имя в текущую область действия, которая ранее была объявлена ​​в другом месте.

Синтаксис

  • using typename ( opt ) nested-name-specifier unqualified-id ;
  • использование :: unqualified-id ;

замечания

Объявление- использование отличается от директивы using , которая сообщает компилятору, чтобы он смотрел в определенном пространстве имен при поиске любого имени. Директива-использование начинается с using namespace .

Объявление- использование также отличается от объявления псевдонима, которое дает новое имя для существующего типа таким же образом, как typedef . Объявление псевдонима содержит знак равенства.

Импорт имен отдельно из пространства имен

После using используется для ввода имени cout из пространства имен std в область main функции, объект std::cout можно называть только cout .

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

Повторное использование элементов из базового класса, чтобы избежать скрытия имени

Если в области класса применяется декларация использования, разрешается только переопределять член базового класса. Например, using std::cout в классе не допускается.

Часто имя, о котором было объявлено, является тем, которое иначе было бы скрыто. Например, в приведенном ниже коде d1.foo относится только к Derived1::foo(const char*) и произойдет ошибка компиляции. Функция Base::foo(int) скрыта вообще не рассматриваемой. Тем не менее, d2.foo(42) отлично, потому что using-declaration приносит Base::foo(int) в набор объектов с именем foo в Derived2 . Затем поиск имени находит и foo s, и разрешение перегрузки выбирает 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
}

Наследование конструкторов

C ++ 11

В качестве специального случая использование-объявления в области класса может ссылаться на конструкторы прямого базового класса. Эти конструкторы затем наследуются производным классом и могут использоваться для инициализации производного класса.

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");
}

В приведенном выше коде обе Derived1 и Derived2 имеют конструкторы, которые Derived2 аргументы непосредственно соответствующему конструктору Base . Derived1 выполняет переадресацию, а Derived2 , используя функцию C ++ 11 наследующих конструкторов, делает это неявно.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow