С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
1

Rvalue и lvalue

24.07.2020, 23:54. Показов 3266. Ответов 54
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот так я возвращаю lvalue ссылку на lvalue объект
C++
1
int& test() {int a; return a;}
Вот так rvalue ссылку на rvalue объект
C++
1
someclass&& test() {return someclass() ;}
А вот так я что возвращаю?
C++
1
someclass test() {someclass sc; return sc;}
Если выключить все оптимизации и представить что у класса someclass есть все конструкторы и все операторы то какие должны сработать в этом(третьем) варианте?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2020, 23:54
Ответы с готовыми решениями:

C++ expressions - rvalue, glvalue, prvalue, xvalue, lvalue, а также rvalue reference: что есть что?
Доброго времени суток, не понимаю до конца деление С++ - выражений (приложение 1). Lvalue вроде...

RVALUE Ссылка, error: cannot bind non-const lvalue reference of type 'String&' to an rvalue of type 'String'|
Код не компилируется ниже 17 стандарта с++ с ошибкой error: cannot bind non-const lvalue reference...

Проблема с rvalue и lvalue
Не совсем понятно почему создавая ссылку на rvalue она определяется как lvalue ? Пример: ...

Rvalue и lvalue ссылки
Здравствуйте, что расскажите, пожалуйста что такое lvalue и rvalue ссылки и с чем их едят, где...

54
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
25.07.2020, 17:55 21
Author24 — интернет-сервис помощи студентам
в С++ то же самое, сначала в этом году кажиться это нормально, через 10 лет уже нет.

Добавлено через 2 минуты
Vanconts, короче чел, я всегда успокаиваю себя мыслью, и не только я, что тут много людей могут сказать мол, так сложилось исторически и стандарт приходиться переписывать аккуратно.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
25.07.2020, 21:53  [ТС] 22
_stanislav, мне просто нужно запомнить какая категория выражения в какой ситуации получается ? Или есть критерии по которым можно определить является ли выражение rvalue или lvalue?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
25.07.2020, 22:29 23
Цитата Сообщение от Vanconts Посмотреть сообщение
определить является ли выражение rvalue или lvalue?
я же скинул тебе класную статейку http://rsdn.org/article/cpp/lvalue.xml

Добавлено через 29 секунд
чувак читать надо долго и упорно
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
25.07.2020, 22:38  [ТС] 24
_stanislav, та в этой статье объясняется только разные (но не 100%тные) способы как определить rvalue или lvalue
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
25.07.2020, 22:41 25
Цитата Сообщение от Vanconts Посмотреть сообщение
та в этой статье объясняется только разные (но не 100%тные) способы как определить rvalue или lvalue
если есть бошка ты бы смог додумать как пишется стандарт

Добавлено через 33 секунды
может и сам там был
1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
26.07.2020, 03:25 26
Цитата Сообщение от Vanconts Посмотреть сообщение
Вот есть lvalue - это выражения которые имеют и адрес и значение, rvalue - выражения без адреса.
Адреса бывают у объектов. У выражений нет адресов (ни у каких). Это разного уровня сущности.
1
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
26.07.2020, 21:20  [ТС] 27
DrOffset, Что значит у выражений нет адресов? у самых выражений нет адресов по типу
C++
1
1+2
не будет иметь адреса , или результат выражения 1+2 не будет иметь адреса?
Если результат выражения не будет иметь адреса то если результатом выражения будет временный объект то где он будет хранится на время его существования? Он же должен где-то хранится со всеми его членами
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
26.07.2020, 21:47 28
Цитата Сообщение от Vanconts Посмотреть сообщение
Что значит у выражений нет адресов?
Выражение - это сущность уровня компиляции.
Объект - это сущность уровня исполнения. Адреса появляются во время исполнения - это очевидно.

Не забывайте, что язык С++ статически типизированный и компилируемый. Большая часть семантики программы разрешается на этапе компиляции. Все эти rvalue-lvalue - это понятия времени компиляции.

Добавлено через 3 минуты
Цитата Сообщение от Vanconts Посмотреть сообщение
Если результат выражения не будет иметь адреса то если результатом выражения будет временный объект то где он будет хранится на время его существования?
Вы опять все мешаете в кучу.
Выражение может привести, а может и не привести к созданию объекта.
rvalue\lvalue - это категория выражений, забудьте вообще про объекты и адреса, это не поможет вам понять.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
26.07.2020, 21:58  [ТС] 29
DrOffset, категория выражений относится к самим выражениям , а не к их результату?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
26.07.2020, 22:24 30
Vanconts, к результату. Но этот результат в этом рассмотрении - это не объект. Это обозначение синтаксической применимости результата в некотором контексте. Т.е. от этой категории зависит как будет рассматриваться результат выражения в том контексте, в котором вы его пишете: будут ли применяться преобразования, будет ли ошибка компиляции, как поведет себя выбор перегруженной функции или как будет дедуктироваться параметр шаблона, и т.д. Все это перечисленное происходит на этапе компиляции и никак непосредственно не связано с собственно объектом. Объект может появляться на каких-то этапах вычисления выражений, но он существует как бы в параллельном мире, в том, который будет иметь значение только когда вы программу запустите.

Добавлено через 17 минут
Vanconts, ваша ошибка в том, что вы пытаетесь интерпретировать это так, как будто С++ скриптовый язык. Вы написали некое выражение и вам кажется что все его компоненты обязательно должны быть где-то в памяти при вычислении. Я специально второй раз акцентирую внимание на том, что С++ статически типизированный и компилируемый язык. Это очень важно при его понимании.
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
26.07.2020, 23:49 31
Цитата Сообщение от DrOffset Посмотреть сообщение
к результату. Но этот результат в этом рассмотрении - это не объект. Это обозначение синтаксической применимости результата в некотором контексте.
Результат — это обозначение применимости результата?
Откуда вообще всё это взято, про "результат"?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
27.07.2020, 00:19 32
Цитата Сообщение от argcargv Посмотреть сообщение
Откуда вообще всё это взято, про "результат"?
Пытаюсь говорить с ТС на его языке.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
27.07.2020, 00:27 33
Цитата Сообщение от Vanconts Посмотреть сообщение
категория выражений относится к самим выражениям
Да:
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/basic.lval#1
Expressions are categorized according to the taxonomy in Figure ...
— A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function.
— A prvalue is an expression whose evaluation initializes an object or a bit-field, or computes the value of the operand of an operator, as specified by the context in which it appears.
[и т.д.]
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
27.07.2020, 02:17  [ТС] 34
argcargv, DrOffset,
Цитата Сообщение от argcargv Посмотреть сообщение
A prvalue is an expression whose evaluation initializes an object or a bit-field, or computes the value of the operand of an operator, as specified by the context in which it appears.
тоесть
C++
1
2
3
4
5
class t{}; 
t tt(){t ttt; return ttt;}
int main(){
   tt();
}
в даном случае выражение tt() , насколько мне известно , относится к prvalueс определения prvalue можно сразу откинуть (если говорить об выражении tt()) варианты
Цитата Сообщение от argcargv Посмотреть сообщение
bit-field, or computes the value of the operand of an operator
остается
Цитата Сообщение от argcargv Посмотреть сообщение
expression whose evaluation initializes an object
в каком месте оно инициализирует объект?
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
27.07.2020, 02:39 35
Цитата Сообщение от Vanconts Посмотреть сообщение
в каком месте оно инициализирует объект?
tt(); это expression-statement, expression в котором является discarded-value expression:
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4861/stmt.expr
Expression statements have the form

expression-statement:
→expressionopt ;

The expression is a discarded-value expression.
Если discarded-value expression это prvalue, к нему применяется temporary materialization conversion (короче, создаётся временный объект, который инициализируется этим prvalue)
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4861/expr.context#2
In some contexts, an expression only appears for its side effects. Such an expression is called a discarded-value expression.
...
If the (possibly converted) expression is a prvalue, the temporary materialization conversion is applied.
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4861/conv.rval
A prvalue of type T can be converted to an xvalue of type T. This conversion initializes a temporary object of type T from the prvalue by evaluating the prvalue with the temporary object as its result object, and produces an xvalue denoting the temporary object.
1
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
27.07.2020, 11:39  [ТС] 36
argcargv,
Цитата Сообщение от argcargv Посмотреть сообщение
это expression-statement, expression в котором является discarded-value expression
абсолютно ничего не понял , почему expression-statement , что такое discarded-value expression?
и как это всё работает?
0
52 / 30 / 13
Регистрация: 21.05.2017
Сообщений: 109
27.07.2020, 11:51 37
Цитата Сообщение от Vanconts Посмотреть сообщение
абсолютно ничего не понял , почему expression-statement , что такое discarded-value expression?
Позволь задать один вопрос. Зачем тебе это нужно, во всяком случае, на данном этапе?
На практике в подавляющем большинстве случаев об этом даже задумываться не нужно.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
27.07.2020, 12:44  [ТС] 38
MasterOfAlteran, Мне это не даёт покоя, поэтому я хочу в этом разобраться, но, как я понял, видимо зря я захотел )
0
52 / 30 / 13
Регистрация: 21.05.2017
Сообщений: 109
27.07.2020, 12:53 39
Цитата Сообщение от Vanconts Посмотреть сообщение
поэтому я хочу в этом разобраться
Из того что я здесь вижу - не хочешь.

Ты просишь, чтобы тебе всё объяснили. Тебе объясняют, оказывается, ты друггих аспектов не знаешь, снова просишь тебе объяснить.

Если бы действительно хотел бы разобраться, то открыл бы документацию и стал разбираться. Сам! Это ключевое.
1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
27.07.2020, 12:55 40
Цитата Сообщение от Vanconts Посмотреть сообщение
что такое discarded-value expression?
На это от меня была ссылка выше.

Цитата Сообщение от Vanconts Посмотреть сообщение
почему expression-statement
На это тоже была ссылка выше.
1
27.07.2020, 12:55
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2020, 12:55
Помогаю со студенческими работами здесь

Непонятное поведение rvalue/lvalue
Всем привет, объясните, пожалуйста, немного про р-вэлью и л-вэлью в этом коде: #include <iostream>...

Почему i++ это rvalue, а ++i lvalue?
Встречал упоминания что для постинкремента создается временная копия, но дальше не объясняется....

Что такое rvalue и lvalue
как понимать эти штуки?

Семантика перемещения rvalue\lvalue ссылок
Здравствуйте форумчани. Объясните пожалуйста процессы происходящии внутрии функции swap принимающую...

Lvalue, xvalue, glvalue, rvalue, prvalue
Для чего понадобилось такое разделение выражений lvalue, xvalue, glvalue, rvalue, prvalue. Для...

Rvalue, lvalue, xvalue, prvalue, glvalue
Не в той теме начали обсуждать. Создам новую. то, что знаю я (выучил к собесед-ию), но глубокого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C#
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru