Это модифицированная версия другого ответа, который я написал на ту же тему. Достаточно этих вопросов, и, возможно, я получу окончательный пост;)
Основная проблема - конфликт имен, в том случае, если в вашем коде есть переменная cout, и вы using namespace std;
, это будет неоднозначно относительно того, что вы имеете в виду. Это не просто cout
. Также будут включены count
, reverse
и equal
, которые являются общими идентификаторами.
Несмотря на все проблемы с компилятором, это также проблема для любого, кто придет читать ваш код. Эти дополнительные 5 символов гарантируют, что следующий человек, поддерживающий ваш код, точно знает, что вы имеете в виду.
Также стоит отметить, что вы никогда не должны ставить
using namespace std;
В файле заголовка, так как он может распространяться на все файлы, которые включают этот файл заголовка, даже если они не хотят использовать это пространство имен. Другая проблема заключается в том, что также неясно, что пространство имен std было импортировано, поэтому сопровождающий (или вы через 3 месяца) добавляет переменную с тем же именем, что и какая-то непонятная функция std, которая была включена в тот же модуль компиляции, и затем тратит час, пытаясь найти причину ошибки компиляции.
В большинстве случаев очень полезно использовать такие вещи, как
using std::swap
Как будто существует специализированная версия подкачки, компилятор будет использовать ее, иначе он вернется к std::swap
. Если вы звоните std::swap
, вы всегда используете базовую версию, которая не будет вызывать специализированную версию (даже если она существует).
Возьмем, к примеру, код с использованием pimpl idiom . Где в качестве копии по умолчанию можно скопировать все данные в фактической реализации, где все, что нужно сделать, это поменять местами указатели. Использование специализированного свопа может сэкономить огромное количество времени на выполнение, а хорошо спроектированные библиотеки должны специализировать его.
В итоге
Всегда предпочитайте using std::swap
более std::swap()
Избегайте using namespace std
в заголовке любой ценой из-за распространения, старайтесь не использовать его в файлах реализации.
Наличие тысяч using std::foo
в начале каждого файла - не самый лучший способ. В большинстве случаев используйте его для обычных классов.
Все остальное - мнение.