C++
Использование декларации
Поиск…
Вступление
Объявление 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
}
Наследование конструкторов
В качестве специального случая использование-объявления в области класса может ссылаться на конструкторы прямого базового класса. Эти конструкторы затем наследуются производным классом и могут использоваться для инициализации производного класса.
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 наследующих конструкторов, делает это неявно.