Есть ли контекст, в котором выражение `a.b::c` имеет смысл?

В C++ рассмотрим правило грамматики:

member-access-expression: LHSmember-access-operatorRHS
(оп это .)
и
LHS=неквалифицированный id-expression например. который ссылается на переменную экземпляра.
RHS=квалифицированный id-expression (с хотя бы одним вложенным идентификатором)

пример: a.b::c

Если это когда-нибудь сможет пройти семантическую проверку, что это будет за ситуация?

Следующий эксперимент:

struct B{};

struct A
{
    B b;
};

int main()
{
    A a;
    a.b::c;
}

возвращается

'b' is not a class, namespace, or enumeration
a.b::c;
  ^

(демо)

Это, как правило, намекает мне, что не может быть никакого юридического случая квалифицированного идентификатора в отношении права доступа члена.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
16
0
1 017
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Очень простой пример: если вы хотите вызвать функцию-член родительского класса:

struct A {
    void f();
};

struct B: A {
    void f();
};

B b;
b.A::f();

очень интересно. тогда «вид», на который ссылается что-либо, помещенное в позицию A, должен быть struct/class/union/namespace/enum ?

v.oddou 22.05.2019 11:45

@v.oddou Это не так уж удивительно. Эти «виды» - это то, для чего используется оператор разрешения области видимости.

Peter 22.05.2019 11:48

@Питер отлично. Так что у меня все: грамматика верная; и семантическая ситуация, где это правильно: когда A относится к символу вида user defined type.

v.oddou 22.05.2019 11:57

С A посмотрел относительно из области decltype(b) ? это тоже законно b.::A::f() ? (кажется, отлично работает в gcc)

v.oddou 22.05.2019 11:59

Да, это законно.

Peter 22.05.2019 12:05

кроме того, обратите внимание, что интересно, что базы находятся used в их дочерних элементах. что выводит их доступность из области b, даже если они находятся в разных пространствах имен: godbolt.org/z/fO3pJ1

v.oddou 22.05.2019 12:05

Вам даже не нужно наследование. A::f() — допустимое имя для функции f() внутри A, точка. coliru.stacked-crooked.com/a/67d13365926585bd

Lightness Races in Orbit 22.05.2019 14:12

@LightnessRacesinOrbit Это правда, но я не понимаю, почему вы должны делать a.A::f() вместо a.f(), хотя я уже использовал такие вещи, как b.A::f().

Holt 22.05.2019 14:22

@Holt Вероятно, вы бы этого не сделали, но это все еще действительно / законно / «имеет смысл» и проще;)

Lightness Races in Orbit 22.05.2019 14:55

Одним из вариантов использования является доступ к членам enum в некотором struct A с помощью экземпляра A (вместо использования перечисления напрямую через A::b::c):

struct A {
    enum class b { c }; // can be unscoped as well
};

A a;
a.b::c; // Access to enum value c - similarly, A::b::c would work

завораживает. Я знал, что вы можете использовать экземпляр для доступа к статическому полю, но не к типу. Ваш ответ важен для меня, чтобы расширить возможности использования id-expression в сочетании с member-access-expression. Спасибо !

v.oddou 23.05.2019 04:52

Вот тривиальный пример:

struct A {
    void f() {}
};

int main()
{
    A a;
    a.A::f();
}

A::f() — это квалифицированный версия имени функции f, которая является членом A. Вы можете использовать его в доступе для членов точно так же, как «короткое» (или неквалифицированный) имя.

Фактически, можно возразить, что каждый раз, когда вы пишете a.f(), это ярлык для a.A::f() (с частью A:: автоматически берется из decltype(a)).

В этом нет ничего волшебного, хотя необычно видеть конструкцию вне сценариев, продемонстрированных другими ответчиками, потому что в этом примере она избыточна.

превосходный. Это третий пример другого вкуса, который приносит пользу. Это подтверждает, что правая часть доступа к элементу просматривается из области действия его левой части, но результат оценки подвыражения левой части не обязательно используется.

v.oddou 23.05.2019 04:56
fully-qualified это ? если ему не хватает глобальной области действия, он квалифицирован, но не полностью, ИМХО.
v.oddou 23.05.2019 04:57

@v.oddou Хм... хороший вопрос! Я не знаю на самом деле. В любом случае, это не стандартный термин, и я не могу вспомнить, что такое обычное использование. Я просто вырву "полностью-", так как это все равно отвлекает.

Lightness Races in Orbit 23.05.2019 12:33

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