языковой адвокат — что означает «личность» в определении категорий значений в переполнении стека

Короче говоря, вы можете просто ответить на часть о личности, спасибо. Мой основной вопрос в этом вопросе — начать с 2. о личности, я просто попытался представить контекст / основу моего текущего понимания, чтобы он мог помочь вам определить глубину, когда вы пишете свой ответ.


Я хочу понять общую картину системы типов и категорий значений в C ++. Я искал / читал много вопросов и ресурсов в Интернете, но у каждого есть четкое объяснение, поэтому я действительно запутался. Я перечислю часть, которую я не могу понять, если бы кто-нибудь мог дать представление о

  1. На cppreference.com, первая строка:

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

    мой вопрос:

    • Что значит выражение имеет тип? Это тип конечного результата после оценки?
    • Я не хочу изучать шаблон на данном этапе, будет ли это мешать изучению основной части (с точки зрения вашего эксперта)? Мне потребовалось некоторое время, чтобы понять, что ссылка для пересылки и ссылка на rvalue — это разные вещи, которые для шаблона являются первыми.
  2. Ценовые категории:

    Я читаю это ответ — Что такое rvalues, lvalues, xvalues, glvalues ​​и prvalues?, фраза беспокоит меня много идентичность, который также появляется на cppreference.com — категории значений (строка 5, glvalue).

    мой вопрос: могу ли я сказать, что identity == все, что я могу присвоить ему новое значение?

    • Я видел людей, использующих слово адрес / указатель для этого, но это has identity iff has address/pointer? Я хочу точный термин.
    • Я столкнулся с идеей битового поля при чтении cppreference.com, кажется, что дана структура битового поля a, его битовое поле a.m не имеет адреса? Это причина, по которой слово идентичность используется вместо адрес / указатель?
    • я нашел сообщение в блоге, объясняющее это, но определение lvalue нелогично: lvalue обозначает объект, ресурс которого не может быть повторно использован, почему бы и нет?

6

Решение

  1. Тип выражения — это тип его результата, если и когда выражение было оценено. Выражение не иметь быть оцененным, но все выражения имеют тип. Тип является статическое свойство.
  2. Там нет точного определения идентичности или указания, какие объекты имеют или не имеют идентичность. Это грязная концепция, которую лучше оставить в покое. Игнорируй это. Некоторые люди говорят, что идентификация объекта — это его адрес, но тогда эта концепция бесполезна. Почему бы тогда не поговорить о его адресе? А как насчет битовых полей? Это объекты без адресов, у них нет идентичности? Другие говорят, что lvalues ​​имеют идентичность, а rvalues ​​- нет, но тогда это так же избыточно.
3

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

identity это философская концепция. Это свойство вещи, которая делает его уникальным. никакие две «вещи» не могут иметь одинаковую идентичность.

То, что имеет идентичность, является сущностью.

[Basic.lval]:

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

Имя внутри выражения может обозначать только один объект. Так что имя внутри выражения — это тождество. Это определяется как именующий (например, см. expr.prim.id.unqual)

По данному адресу и в данное время не может быть 2 объектов одного типа (могут быть объекты, вложенные друг в друга, …). Таким образом, разыменование указателя дает именующий.

Ссылка всегда обозначает сущность. Таким образом, каждая функция, которая возвращает ссылку при вызове, генерирует glvalue.

xvalue является тегом, который может быть сгенерирован только приведением (или привязкой к временной материализации). Это является glvalue, который обозначает объект или битовое поле, ресурсы которого могут быть повторно использованы basic.lval

Разница между xvalue и именующий используется для создания эффективного кода. Но xvalue как именующий являются glvalue: они приносят личность лица.

prvalue является результатом выражения, которое не связано ни с одним объектом. Это когда функция возвращается как не ссылочный тип или является результатом некоторых встроенных операторов. В c ++ выражение не является сущностью, поэтому оно не имеет идентичности.

У prvalue всегда есть объект результата, который может быть временным объектом. Объект результата является сущностью, он материализуется при необходимости (когда пытаются получить ссылку на него).


Тип выражения четко определено в [expr.type]:

Если выражение изначально имеет тип «ссылка на T» ([dcl.ref], [dcl.init.ref]), тип корректируется до T перед любым дальнейшим анализом.
Выражение обозначает объект или функцию, обозначенную ссылкой, и выражение является lvalue или xvalue, в зависимости от выражения.
[Примечание: до начала жизни ссылки или после ее окончания поведение не определено (см. [Basic.life]).
— конец примечания
 ]

Если значение prvalue изначально имеет тип «cv T», где T — это неквалифицированный cv некласс, не относящийся к массиву, тип выражения корректируется до T перед любым дальнейшим анализом.

Выражение не может иметь ссылочный тип.

3

Прежде всего, если вы действительно хотите изучить формализмы / детали C ++, вам следует обратиться к стандартам (или их проектам); вместо вики-страниц (которые могут быть или не быть правильными; хотя cppreference, как правило, довольно хорошо). Увидеть Где я могу найти текущие стандартные документы C или C ++?.

Сказав это, нет необходимости изучать стандарт (ы) C ++ для использования языка. На самом деле, большинство разработчиков этого не делают, и наверняка они не предназначены для изучения C ++. Это официальный документ, а не учебный / учебный материал. Так что, если вы только изучаете C ++, купите хорошую книгу об этом. Увидеть Полное руководство и список книг C ++ вместо.


Что значит выражение имеет тип? Это тип конечного результата после оценки?

Нет, его не нужно оценивать (т.е. во время выполнения), чтобы иметь тип. Например, sizeof expr имеет тип std::size_t, еще expr не оценивается.

Я не хочу изучать шаблон на данном этапе, будет ли это мешать изучению основной части (с точки зрения вашего эксперта)? Мне потребовалось некоторое время, чтобы понять, что ссылка для пересылки и ссылка на rvalue — это разные вещи, которые для шаблона являются первыми.

На самом деле, все наоборот: если вы хотите изучать C ++ для практического использования, вам определенно необходимо изучить хотя бы основы шаблонов (хотя бы для того, чтобы использовать стандартную библиотеку и не потеряться полностью).

Однако формально вам не нужно знать все о том, как они работают с типами значений, ссылками на rvalue или самими шаблонами, чтобы иметь возможность программировать.

фраза беспокоит меня много идентичность

В стандарте нет определения «идентичность». В C ++ 17 он используется в нескольких местах, например, при определении glvalue:

— А glvalue является выражением, оценка которого определяет идентичность объекта, битового поля или функции.

Но, действительно, вы могли бы сказать, что «иметь идентичность» означает «фактически существующее где-то в памяти (если требуется)». Лучшее, что вы можете сделать, чтобы понять эту терминологию, это прочитать что написал Страуструп:

«Имеет идентичность» — то есть и адрес, указатель, пользователь может определить, идентичны ли две копии и т. Д.

Вы также можете думать об этом противоположным образом: glvalue (то, что имеет идентичность) — это любое выражение, которое не является prvalue, если это помогает.

1
По вопросам рекламы [email protected]