Может ли оператор :: отображаться в контексте, отличном от разрешения области при поиске квалифицированного имени?

В качестве известного оператора разрешения области действия используется для целей поиска квалифицированного имени. Но какое значение возвращает ::? Как я понял это постфиксный унарный оператор. Учтите следующее:

namespace A
{
//something
}

A:: //error: expected unqualified-id before ‘int’

int main(){ }

Вы можете объяснить это поведение?

6

Решение

Оператор разрешения области :: является только синтаксическим оператором, другой семантики не имеет. То есть есть операторы, которые вносят вклад только в синтаксис языка, а другие — также в семантику / поведение программы во время выполнения, и эту семантику можно настраивать. Это перегрузка операторов.

5

Другие решения

Насколько я знаю, единственный смысл (не перегружен) :: Оператор — это разрешение области.
Ваш код интерпретируется как A::int main() который генерирует ошибку.

2

:: Оператор разрешения контекста используется только как, ну … оператор разрешения контекста.

В частности, грамматика 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
2

Оператор разрешения контекста :: не является вызовом функции, он встроен в язык и используется компилятором для поиска имен; он возвращает тип, который находится справа от него.

Выдержка из стандарта:

Спецификатор вложенного имени, который обозначает класс, за которым может следовать
шаблон ключевого слова (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;
}
0
По вопросам рекламы [email protected]