Что означает «идентичность» в определении категорий значений в C ++ - PullRequest
0 голосов
/ 23 ноября 2018

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


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

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

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

    мой вопрос:

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

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

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

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

Ответы [ 3 ]

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

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

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

[basic.lval] :

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

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

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

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

...

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

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

...

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

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


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

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

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

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

0 голосов
/ 23 ноября 2018

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

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


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

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

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

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

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

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

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

- A glvalue - это выражение, оценка которого определяет идентичность объекта, бит-field или function.

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

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

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

...