05 июля 2020

#12 Директива using для импорта имён

Когда получаешь, больше чем хотел, ты не всегда рад
Если использовать в файле директиву using для упрощённого обращения к членам какого-нибудь пространства имён, мы получаем до конца этого файла (и всех файлов, которые его вздумают включить) возможность обращаться ко всем идентификаторам этого пространства имён прямо по конечному имени (имеется в виду неквалифицированный поиск имени, который для функций, ещё и влияет на Argument-dependent lookup), больше шансов встретить коллизию имён, косые взгляды коллег по цеху. Особенность такого объявления -- все члены этого пространства имён представляются так, будто они были объявлены в глобальной области видимости, а не в той, в которой находится директива using. А это означает, что любые локальные идентификаторы, перекрывают идентификаторы из пространства имён.

Using-объявления -- выход из ситуации. Они позволяют точечно объявить в текущей области видимости имя конкретного идентификатора из пространства имён, не засоряя именами текущую область, а так же запрещает повторно использовать идентификаторы, к которым теперь можно обращаться без квалификации доступа:

double func(const double v) {
  using std::list;
  // ...
  double list = 0.; // Ошибка. Повторное объявление list
}