Почему запрещено указывать имя во внешней декларации? - PullRequest
0 голосов
/ 07 ноября 2019

Почему имена, представленные в объявлении extern, допускаются только из самого внутреннего пространства имен? К какому осложнению это привело бы, если бы они не были? Или это просто потому, что эта часть стандарта была скопирована из стандарта C, где нет пространства имен?

Пожалуйста, см. Соответствующую часть стандарта

РЕДАКТИРОВАТЬ: Anпример сценария, в котором квалификация была бы удобной: использование x в шаблоне функции f в пространстве имен ns, где x определено где-то в глобальном пространстве имен и не желательно вводить (вне определения функции) во всех единицах перевода, которые # включают заголовок с f.

namespace ns
{
  template <typename> void f()
  {
    // extern int ::x; // ill-formed
    extern int x;      // refers to ns::x, which is not the case :(
    ++x;
  }
}

1 Ответ

0 голосов
/ 07 ноября 2019

Почему запрещено указывать имя во внешнем объявлении?

Потому что это бессмысленно.

Предположим, вы хотите использовать foo::bar, находясь в пространстве имен foo:::baz. Есть два случая

  1. Объявление foo::bar является видимым. Тогда вам не нужно переопределять его. Просто используйте имя, уточняйте при необходимости.
  2. Объявление foo::bar не отображается. Тогда вы не можете сначала объявить его в любом пространстве имен, кроме foo.

Почему имена, введенные в объявлении extern, допускаются только из самого внутреннего пространства имен?

Это не так. Они могут исходить из глобального пространства имен, которое является основным вариантом использования extern. Другой вариант использования - это предварительное объявление функции, которая будет определена позже в том же пространстве имен, что, я полагаю, является единственной причиной, по которой такие объявления пространства имен даже разрешены. Нет особой необходимости в extern за пределами этих случаев использования. Объявление вперед foo::bar изнутри foo::baz слишком запутанно и подвержено ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...