Какова целевая область определения статического члена?

int x = 42;
struct A {
  static int x; // 1
};
int A::x = x;   // 2

Почему в 2 повторное объявление x находится в области класса? Где находится локус какого-то объявления — только при первом объявлении (1) или каждое переобъявление имеет свой локус (1 и 2)?

«Почему в 2 повторное объявление x находится в области класса?...» Потому что вы написали A::x, означающее, что любое имя после этого также будет искаться в области класса.

user12002570 18.08.2024 11:42

Не уверен, что вы спрашиваете. Когда вы находитесь в глобальной области видимости, x — глобальный, а A::x — статический класс.

wohlstad 18.08.2024 11:43

@wohlstad Нет, второй x в int A::x = x; на самом деле статический.

user12002570 18.08.2024 11:45

Не могли бы вы привести цитату, объясняющую, почему A::x находится в области класса, а не в глобальной области?

cppbest 18.08.2024 11:45

В // 2 вы снова входите в область действия класса в той точке, где появляется A::. Отсюда, вплоть до ; в конце определения, вы можете использовать любое имя, объявленное в классе.

tbxfreeware 18.08.2024 11:45

@user12002570 user12002570 Понятно. Это потому, что упоминание A::x выводит нас в область действия класса?

wohlstad 18.08.2024 11:46

@wohlstad По сути, при поиске в дополнение к глобальной области поиска также используется указанный класс (который здесь A). Это из-за A::x

user12002570 18.08.2024 11:47

@tbxfreeware, не могли бы вы предоставить ссылку на цитату, объясняющую это?

cppbest 18.08.2024 11:48

@wohlstad Это (A::x) очень актуально.

user12002570 18.08.2024 11:49

@user12002570 user12002570 Хорошо, тогда это имеет больше смысла.

wohlstad 18.08.2024 11:50

Это не ответ на вопрос, но вы можете уточнить область действия, используя = ::x;.

BoP 18.08.2024 12:04

@BoP смысл неполного имени состоит в том, чтобы показать, что A::x на самом деле находится в области класса, т. е. имя x позже относится к статическому члену, а не к глобальной переменной.

cppbest 18.08.2024 12:12

Вы неправильно поняли @BoP.

Chukwujiobi Canon 18.08.2024 12:25

Я не могу воспроизвести, godbolt.org/z/daaGqnT1E, какой компилятор и настройки вы используете?

Pepijn Kramer 18.08.2024 12:25

Почему в 2 повторное объявление x находится в области класса? Это так?

Language Lawyer 18.08.2024 12:47

@Language Lawyer Внутри класса глобальный x скрыт статическим x. Вы можете получить доступ к глобальному x, но только если у вас есть к нему доступ: ::x. Во внешнем определении A::x вы повторно входите в область действия класса, которая затем расширяется до ;, что завершает определение. В этой области глобальный x снова скрыт. Чтобы добраться до него, вы должны его охватить. В противном случае любое появление x относится к статической переменной, определенной в классе.

tbxfreeware 18.08.2024 13:00

@tbxfreeware это не требует присутствия в области класса

Language Lawyer 18.08.2024 13:04

Конечно. Приоритет поиска имени такой же, как если бы вы повторно вошли в область действия класса. Если, например, существуют базовые классы или A является вложенным классом, эти классы будут проверены перед рассмотрением лексической области внешнего определения. Я всегда думал об этом как о «повторном входе» в рамки класса, но если это неправильный термин, я поправлюсь.

tbxfreeware 18.08.2024 13:08

@cppbest вновь открыт.

user12002570 19.08.2024 06:38

@LanguageLawyer, вы имеете в виду, что «находиться в области видимости» — это не то же самое, что «присутствовать в области видимости»?

cppbest 19.08.2024 06:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
21
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Целевая область A::x — это область класса A, потому что [dcl.meaning.general]/(3.4):

В противном случае имя терминала идентификатора-декларатора не ищется. Если это квалифицированное имя, декларатор должен соответствовать одному или нескольким объявлениям, номинируемым в S; все объявления должны иметь одну и ту же целевую область, и целевая область декларатора — это эта область.

(Здесь S — контекст поиска A::x[dcl.meaning.general]/(3.1).)

Этот ответ не объясняет, почему эти два слова разные, хотя они кажутся одинаковыми: int A::x = x; и int A::x = ::x;.

Chukwujiobi Canon 18.08.2024 12:24

@ChukwujiobiCanon eel.is/c++draft/basic.scope.class#1.sentence-2

cpplearner 18.08.2024 12:31

Все еще не отвечает на мой комментарий.

Chukwujiobi Canon 18.08.2024 12:59

@ChukwujiobiCanon это не вопрос ОП.

463035818_is_not_an_ai 18.08.2024 13:25

@ChukwujiobiCanon • A::x и x относятся к x в области A. ::x относится к x в глобальной области, а не к A. Вот почему они не одинаковы.

Eljay 18.08.2024 13:54

@Элджей, я знаю это. Прочтите ответ еще раз. Ответ касается другой темы. В ответе должна была быть ссылка на другую часть стандарта, а не на эту. В любом случае я остаюсь в стороне.

Chukwujiobi Canon 18.08.2024 15:26

Это ответ, спасибо.

cppbest 19.08.2024 06:37

Другие вопросы по теме