Я согласен со всем Грег написал , но я хотел бы добавить: Это может быть даже хуже, чем сказал Грег!
Библиотека Foo 2.0 может представить функцию Quux()
, которая однозначно лучше соответствует для некоторых ваших вызовов Quux()
, чем bar::Quux()
, который ваш код вызывал годами. Тогда ваш код все еще компилирует , но он молча вызывает неправильную функцию и делает бог знает что. Это настолько плохо, насколько это возможно.
Имейте в виду, что пространство имен std
имеет тонны идентификаторов, многие из которых очень общих (например, list
, sort
, string
, iterator
и т. Д.). ) которые, скорее всего, появятся и в другом коде.
Если вы считаете это маловероятным: здесь был вопрос, заданный здесь, в переполнении стека, где в значительной степени именно это и произошло (неправильная функция вызвана из-за пропущенного префикса std::
) примерно через полгода после того, как я дал это ответ. Здесь - еще один, более свежий пример такого вопроса.
Так что это настоящая проблема.
Вот еще один момент данных: много-много лет назад я также находил, что меня раздражает необходимость добавлять все префиксы из стандартной библиотеки к std::
. Затем я работал в проекте, где с самого начала было решено, что директивы и объявления using
запрещены, за исключением областей действия функций. Угадай, что? Большинству из нас потребовалось очень несколько недель, чтобы привыкнуть к написанию префикса, и спустя еще несколько недель большинство из нас даже согласилось с тем, что это фактически делает код более читабельным . Для этого есть причина: Если вы любите более короткую или длинную прозу, это субъективно, но префиксы объективно добавляют ясности к коду. Не только компилятор, но и вы тоже его найдете легче увидеть, на какой идентификатор ссылаются.
За десятилетие этот проект вырос до нескольких миллионов строк кода. Поскольку эти обсуждения возникают снова и снова, мне однажды было любопытно, как часто (разрешенная) область действия функции using
фактически использовалась в проекте. Я нашел источники для него и нашел только одно или два десятка мест, где он использовался. Для меня это означает, что после попытки разработчики не находят std::
достаточно болезненным для применения директив даже один раз каждые 100 килокалорий, даже там, где это разрешено использовать.
Итог: явный префикс всего не приносит никакого вреда, требует очень мало привыкания и имеет объективные преимущества. В частности, это облегчает интерпретацию кода компилятором и читателями - и это, вероятно, должно быть главной целью при написании кода.