Это измененная версия другого ответа, который я написал по тому же вопросу.Хватит этих вопросов и, возможно, я получу окончательный пост;)
Основная проблема - конфликты имен, в том случае, если у вас есть переменная 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
в верхней части каждого файла - это не путь. В большинстве случаев используйте его для общепринятых классов.
Все остальное - мнение.
не используйте второе соглашение, вы потеряете свое здравомыслие. –
Второе соглашение, конечно, правильно использовать. – 2009-12-25 17:43:50
Второй или третий в зависимости от контекста. Первый должен использоваться только для учебника «Hello World» или быстрых демонстраций. –