Используйте директивы `using namespace` для переходного периода, для фундаментальных библиотек (таких как `std`) или внутри локальной области видимости (только)
Причина
using namespace может приводить к конфликтам имён, поэтому следует использовать его экономно. Тем не менее не всегда возможно квалифицировать каждое имя из пространства имён в пользовательском коде (например, в переходный период), а иногда пространство имён настолько фундаментально и повсеместно в кодовой базе, что постоянная квалификация была бы многословной и отвлекающей.
Пример
#include <string>
#include <vector>
#include <iostream>
#include <memory>
#include <algorithm>
using namespace std;
// ...
Здесь (очевидно) стандартная библиотека используется повсеместно и, по всей видимости, никаких других библиотек нет, поэтому требование std:: везде было бы отвлекающим.
Пример
Использование using namespace std; открывает программиста для конфликта имён с именем из стандартной библиотеки:
#include <cmath>
using namespace std;
int g(int x)
{
int sqrt = 7;
// ...
return sqrt(x); // error
}
Однако это вряд ли приведёт к разрешению, которое не является ошибкой, и люди, использующие using namespace std, предположительно знают о std и об этом риске.
Примечание
Файл .cpp является формой локальной области видимости. Разница в возможностях конфликтов имён между N-строчным файлом .cpp, содержащим using namespace X, N-строчной функцией, содержащей using namespace X, и M функциями, каждая из которых содержит using namespace X с N строками кода в сумме, невелика.
Примечание
Не пишите using namespace в глобальной области видимости в заголовочном файле.