Это действительно правильно?
Что делать, если у меня есть два типа :: bat и :: foo :: bar
Я хочу сослаться на тип летучей мыши, но случайно нажал клавишу r вместо t (они рядом друг с другом).
Правильно ли для компилятора выполнять поиск в каждом пространстве имен, чтобы найти :: foo :: bar, даже не предупредив меня?
Или что делать, если я использую "bar" как сокращение для типа ":: foo :: bar" по всей моей кодовой базе.
Затем однажды я включаю библиотеку, которая определяет тип данных :: bar. Внезапно возникает неопределенность там, где ее раньше не было. И вдруг «правильная вещь» стала неправильной.
Правильнее всего, что компилятор сделает в этом случае, будет предполагать, что я имел в виду тип, который я на самом деле написал. Если я пишу строку без префикса пространства имен, следует предположить, что я имею в виду панель типов в глобальном пространстве имен. Но если это произойдет в нашем гипотетическом сценарии, он изменит тип того, на что ссылается мой код, даже не предупредив меня.
В качестве альтернативы, это может привести к ошибке, но это будет просто смешно, потому что даже при существующих правилах языка здесь не должно быть двусмысленности, поскольку один из типов скрыт в пространстве имен I не указывать, поэтому это не следует рассматривать.
Другая проблема заключается в том, что компилятор может не знать, какие существуют другие типы. В C ++ порядок определений имеет значение.
В C # типы можно определять в отдельных сборках и ссылаться на них в вашем коде. Как компилятор узнает, что другого типа с таким же именем не существует в другой сборке, просто в другом пространстве имен? Как он узнает, что один не будет добавлен к другой сборке позже?
Правильнее всего делать то, что доставляет программисту меньше всего неприятных сюрпризов. Второе предположение программиста на основе неполных данных, как правило, не является правильным решением.
В большинстве языков есть несколько инструментов, позволяющих избежать указания пространства имен.
В c ++ у вас есть "использование пространства имен foo", а также typedefs. Если вы не хотите повторять префикс пространства имен, не делайте этого. Используйте инструменты, предоставляемые языком, поэтому вам не нужно.