явная квалификация в объявлении C++

Следующее определение пространства имен не компилируется, когда первое объявление закомментировано. Если первое объявление foo не закомментировано, то оно прекрасно компилируется.

namespace Y
{
    //void foo();
    void ::Y::foo(){}
}

В соответствующей части стандарта (§8.3¶1) говорится:

Когда declarator-id квалифицирован, объявление должно ссылаться на ранее объявленный член

Я понимаю, что это правило предотвращает введение имен в другие пространства имен. Интересно, можно ли смягчить это правило, чтобы разрешить qualified-id ссылаться на текущее пространство имен.


person Hector    schedule 11.11.2015    source источник
comment
Человеку, который проголосовал за закрытие, потому что неясно, о чем я спрашиваю: вопрос уже есть в тексте: Есть ли какие-либо проблемы, если это правило будет ослаблено, чтобы разрешить использование квалифицированного идентификатора, относящегося к текущему пространству?   -  person Hector    schedule 11.11.2015
comment
Есть ли у вас действительный вариант использования для этого ослабления правил?   -  person Karoly Horvath    schedule 11.11.2015
comment
@KarolyHorvath: определите действительный ;-) … автоматическая генерация кода могла бы выиграть, если бы все идентификаторы могли включать свои области. Обратите внимание, что речь идет о программах, которые пишут программы, не обязательно предназначенные для потребления человеком.   -  person Hector    schedule 11.11.2015
comment
Забавно, я на самом деле думал об этом ;) Но я так и не смог придумать сценарий.   -  person Karoly Horvath    schedule 11.11.2015


Ответы (1)


CWG #482 актуально:

В соответствии с 8.3 [dcl.meaning] параграф 1, […]
Это ограничение запрещает примеры, подобные следующему:

void f();
void ::f();        // error: qualified declarator

namespace N {
  void f();
  void N::f() { }  // error: qualified declarator
}

Кажется, нет веской причины для запрещения таких объявлений, и ряд реализаций принимают их, несмотря на запрет Стандарта. Следует ли изменить Стандарт, чтобы разрешить их?

Заметки с апрельской встречи 2006 г.:

При обсуждении вопроса 548 CWG согласилась с тем, что запрет на использование квалифицированных деклараторов в их пространстве имен должен быть снят.

Таким образом, ваш код действителен, если присутствует первое объявление foo (примерно с 2012 года; GCC имеет открыть отчет об ошибке). Однако, если нет, ваша цитируемая формулировка по-прежнему применяется и делает квалифицированное заявление неправильным. Я не вижу причин допускать этот случай; это интуитивно подразумевает, что имя уже было объявлено, поскольку поиск квалифицированного имени должен определить, к чему оно относится.

person Columbo    schedule 11.11.2015