Почему copy или back_inserter могут быть вызваны без указания пространства имён?

В языке программирования C++ существует механизм включения пространств имён (namespace) при помощи директивы using. Это позволяет использовать имена из какого-либо пространства имён без явного указания префикса.

Например, в стандартной библиотеке C++ имеется пространство имён std, в котором определены множество полезных классов, функций и объектов. Одна из таких функций - copy, которая копирует элементы из одного диапазона в другой. Её прототип следующий:

template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last, OutputIt d_first);

Чтобы использовать функцию copy, необходимо обычно указывать префикс std:: перед её именем:

std::copy(begin(source), end(source), begin(destination));

Однако, если мы включили пространство имён std при помощи директивы using в начале программы, то можем использовать имена из этого пространства имён без явного указания префикса:

using namespace std;
copy(begin(source), end(source), begin(destination));

То же самое относится и к функции back_inserter, которая создаёт вставщик (back inserter) - специальный итератор, позволяющий добавлять элементы в конец контейнера. Её прототип выглядит так:

template<class Container>
back_insert_iterator<Container> back_inserter(Container& c);

Используя директиву using namespace std, мы можем вызывать эту функцию без указания префикса:

using namespace std;
vector<int> numbers;
auto inserter = back_inserter(numbers);

Однако, следует быть осторожным при использовании using namespace в больших проектах или при объединении различных библиотек, так как это может привести к конфликтам имен. Также, использование using namespace в заголовочных файлах не рекомендуется, чтобы избежать возможных проблем при инклюде этих файлов в другие части кода. Вместо этого рекомендуется использовать явные префиксы при вызове функций, например std::copy или std::back_inserter. Это помогает избежать возможных конфликтов и повышает читаемость и понимание кода.