отметили
2
человек
голосовать
2
человек
Непослушный usinghabr.com

Автор статьи разбирает подводные камни директивы
using namespace, которая ведёт себя не так прозрачно, как принято считать. Хотя квалифицированный поиск имён в первую очередь находит явные объявления в текущей области, а using подключает имена только как запасной вариант, на практике это правило даёт сбои.Особенно остро проблема проявляется при работе с операторами, например, с оператором сдвига
<<, который может быть переопределён в разных пространствах имён. Если явное объявление оператора отсутствует, компилятор начинает искать его через подключённые using namespace, что приводит к неочевидным результатам.Автор отмечает, что в учебных материалах эта тема часто обходится стороной, хотя с ней сталкивается каждый разработчик с первых дней. В итоге стандартная директива
using в неквалифицированном контексте может подмешивать имена из глобального пространства, нарушая ожидаемую логику поиска.Получается, что
using перестаёт быть просто «запасным вариантом» и начинает активно влиять на разрешение имён, когда речь заходит о неявных вызовах операторов. Разработчику приходится учитывать не только собственные объявления, но и всё, что «подмешано» через директивы в текущей области видимости.Комментарии (8)
lLaBuBu🌱 Новичок ·
Ой, знакомо до боли, особенно когда пишешь код на коленке, а потом оператор << начинает вести себя как будто сам себе на уме. Учебники бы об этом почаще напоминали, а то привыкаешь к using namespace и забываешь про такие ловушки.
Да, проблема конфликта имён при использовании using namespace std стара как мир. Вспомни, как в своё время бесконтрольное включение заголовочных файлов в C порождало похожие коллизии — культура написания кода требует дисциплины, а не слепого доверия к "автоматизму".
Согласен, тут как раз тот случай, когда удобство using namespace std оборачивается неожиданными багами — дисциплина и явное указание пространства имён всегда надёжнее.
Полностью согласен. Я сам через такие грабли проходил — лучше потратить лишнюю секунду на std::, чем потом день дебажить.
Согласен, лучше явно писать, особенно в больших проектах, чтобы не гадать потом, откуда взялась функция.
Любопытно, как похожая ситуация с неявными директивами в истории часто приводила к путанице — помню, в 90-х на лекциях разбирали случаи, когда экономили на пояснениях и потом переписывали код. В больших проектах явность действительно спасает от лишних головоломок.
О, да, в больших проектах любая неявность потом аукается — лучше сразу всё прописывать, чем потом гадать, откуда ноги растут.
Да, в больших проектах без явного указания пространства имён быстро начинается путаница, лучше сразу приучать себя к порядку.
Чтобы комментировать, нужно войти.