Коллега утверждает, что эти двоеточия
сделать someObject явно глобальным и
таким образом предотвратить путаницу с возможным
local someObject.
Да - это означает, что функция может и должна соответствовать только в глобальном пространстве имен. Это делает очевидным, что вы имеете дело с глобальным, и предотвратит случайное сопоставление с чем-то более локальным (функция beit local, член объекта, член пространства имен, в используемом вами пространстве имен, совпадение поиска Кенига и т. Д.).
Я бы подумал, что тебя не будет
возможность определить someObject локально, если
это уже было определено глобально?
Было бы очень плохой идеей сделать это ошибкой. Скажем, команда программистов решает, что они хотят добавить переменную под названием «last_error» в свое пространство имен: им не нужно беспокоиться, если существующие функции в пространстве имен используют одно и то же имя для локальной переменной. Если вы копируете функцию из одного пространства имен или класса в другое, вам не нужно делать подверженные ошибкам замены идентификаторов в реализации.
Относительно преимуществ :: рассмотрим:
namespace X
{
void fn() {
rip(data, bytes); // MP3 rip this data
}
}
... затем fn()
необходимо быстро переместить в пространство имен Y ...
namespace Y
{
void rip(const char* message, int exit_code); /* for fatal errors */
...
}
... случайное копирование-вставка в кишки Y может легко упустить из виду, что журнал не будет соответствовать той же глобальной функции, которую он использовал, когда fn находился в пространстве имен X, но - как показано - функциональность может заметно отличаться: -.)
Вы можете думать о каждом пространстве имен, классе / структуре и функциях, образующих дерево, где каждый уровень должен иметь уникальный ключ (то есть, нет классов с одинаковыми именами в одном и том же пространстве имен), но потомки всегда независимы друг от друга и их предков , Расширение свободы самостоятельного выбора важно для того, чтобы позволить многим людям одновременно работать над большой проблемой.
Не могли бы вы пролить свет на то, что
эти двоеточия означают и являются ли они
необходимо
В этом конкретном использовании ::, вероятно, не является строго необходимым Это добавляет немного защиты, но затрудняет перемещение переменной в более локальную область видимости позже - хотя это не так важно, потому что компилятор расскажет вам о местах, которые продолжают ссылаться на :: x после перемещения x.