В качестве известного оператора разрешения области действия используется для целей поиска квалифицированного имени. Но какое значение возвращает ::
? Как я понял это постфиксный унарный оператор. Учтите следующее:
namespace A
{
//something
}
A:: //error: expected unqualified-id before ‘int’
int main(){ }
Вы можете объяснить это поведение?
Оператор разрешения области ::
является только синтаксическим оператором, другой семантики не имеет. То есть есть операторы, которые вносят вклад только в синтаксис языка, а другие — также в семантику / поведение программы во время выполнения, и эту семантику можно настраивать. Это перегрузка операторов.
Насколько я знаю, единственный смысл (не перегружен) ::
Оператор — это разрешение области.
Ваш код интерпретируется как A::int main()
который генерирует ошибку.
::
Оператор разрешения контекста используется только как, ну … оператор разрешения контекста.
В частности, грамматика C ++, как указано в стандарте в п. 5.1.1 / 8, такова:
qualified-id:
nested-name-specifier template(opt) unqualified-id
nested-name-specifier:
::
type-name ::
namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier templateopt simple-template-id ::
В твоем случае nested-name-specifier
в форме namespace-name ::
конкретно A ::
, Для qualified-id
тебе нужно по крайней мере а также unqualified-id
,
unqualified-id
имеет следующую грамматику согласно §5.1.1:
unqualified-id:
identifier
operator-function-id
conversion-function-id
literal-operator-id
~ class-name
~ decltype-specifier template-id
Оператор разрешения контекста :: не является вызовом функции, он встроен в язык и используется компилятором для поиска имен; он возвращает тип, который находится справа от него.
Выдержка из стандарта:
Спецификатор вложенного имени, который обозначает класс, за которым может следовать
шаблон ключевого слова (14.2), а затем имя участника
либо этого класса (9.2) или одного из его базовых классов (пункт 10), является
квалифицированный идентификатор; 3.4.3.1 описывает поиск имен для членов класса, которые
появляются в квалифицированных идентификаторах. Результатом является член. Тип
Результатом является тип члена.
В вашем случае компилятор ищет
A :: ИНТ
что, очевидно, не то, что вы хотели бы.
Простой пример:
int count = 0;
int main(void) {
int count = 0;
::count = 1; // set global count to 1
count = 2; // set local count to 2
return 0;
}