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

Rvalue и lvalue

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

Студворк — интернет-сервис помощи студентам
Вот так я возвращаю 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 of type 'String&' to an rvalue of...

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

54
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.07.2020, 00:17
Цитата Сообщение от Vanconts Посмотреть сообщение
Вот так я возвращаю lvalue ссылку на lvalue объект
Ссылка на локальный объект, это не то что нужно считать хорошим правилом:
Цитата Сообщение от Vanconts Посмотреть сообщение
Вот так я возвращаю lvalue ссылку на lvalue объект
Vanconts, для того чтобы вернуть что нибудь ненужное, нужно сначала получить что нибудь ненужное. Можно получить ссылку из-вне, создать объект в куче, использовать статический локальный объект или даже глобальный...
Цитата Сообщение от Vanconts Посмотреть сообщение
А вот так я что возвращаю?
Возврат по значению может трактоваться компилятором по разному. Самое тяжелое - вернёт копию.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
25.07.2020, 01:01  [ТС]
IGPIGP, та я просто для примера, то что возврат ссылки на локальный объект это неправильно это понятно.
Вопрос в том что в 3 случае происходит? Если вернёт копию значит эта копия будет rvalue? Почему если написать конутркуторы для этого класса то сработает конутрктор перемещения в месте возврата значения? А не конструктор копирования.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.07.2020, 01:34
Цитата Сообщение от Vanconts Посмотреть сообщение
Почему если написать конутркуторы для этого класса то сработает конутрктор перемещения в месте возврата значения? А не конструктор копирования.
Ну потому что так язык работает.
Если вы возвращаете объект по значению и у него доступен конструктор перемещения, то будет перемещение. Потому что потенциально перемещение по крайней мере не хуже, чем копирование, а локальный объект уже все равно никто больше не использует, так почему бы и не попробовать его переместить?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
25.07.2020, 01:38
Цитата Сообщение от Vanconts Посмотреть сообщение
А вот так я что возвращаю?
C++
1
someclass test() {someclass sc; return sc;}
Объект по значению. Результат вызова такой функции - prvalue.

Цитата Сообщение от Vanconts Посмотреть сообщение
Если выключить все оптимизации
В языке С++ нет такого понятия как "включить оптимизации" или "выключить оптимизации".

Цитата Сообщение от Vanconts Посмотреть сообщение
и представить что у класса someclass есть все конструкторы и все операторы то какие должны сработать в этом(третьем) варианте?
Вопрос не имеет смысла, пока речь не идет о конкретном примере вызова такой функции.
2
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.07.2020, 08:10
Vanconts,
в первых двух случаях ты возвращаешь локальный объект по ссылке, чего делать нельзя.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
25.07.2020, 11:14  [ТС]
DrOffset, но насколько я знаю ссылку на rvalu нельзя инициализировать lvalue, почему тогда конструктор перемещения срабатывает?

Добавлено через 1 час 4 минуты
TheCalligrapher, мне бы книжечку какую-то чтобы разобраться во всех этих rvalue xvalue prvalue и что там еще есть... Подскажете ?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.07.2020, 12:47
Лучший ответ Сообщение было отмечено Vanconts как решение

Решение

Vanconts, давай я подскажу, читать по порядку:
http://rsdn.org/article/cpp/lvalue.xml
https://rsdn.org/article/cpp/Cpp11NewStd.xml
https://habr.com/ru/post/226229/
https://habr.com/ru/post/322132/
и перечитывать пока не наступит эйфория.

Добавлено через 5 минут
еще у Мейерса в книге https://coollib.net/b.usr/Skot... %2B%2B.pdf расписано более имение, советую все прочитать, а по твоему вопросу Глава 5.

Добавлено через 5 минут
Цитата Сообщение от Vanconts Посмотреть сообщение
мне бы книжечку какую-то чтобы разобраться во всех этих rvalue xvalue prvalue и что там еще есть... Подскажете ?
они тебе не подскажут книгу где это расписано, потому что у них это в крови.
2
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
25.07.2020, 12:55  [ТС]
_stanislav,
Цитата Сообщение от _stanislav Посмотреть сообщение
они тебе не подскажут книгу где это расписано, потому что у них это в крови.

Не по теме:

но они же тоже когда-то с чего-то начинали :)

0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.07.2020, 13:08
Цитата Сообщение от _stanislav Посмотреть сообщение
они тебе не подскажут книгу где это расписано
Что за ерунда?
Вот именно книгу Мейерса сначала и нужно читать по этой теме. А потом уже всякие статьи и т.п.
2
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.07.2020, 13:13
Цитата Сообщение от Vanconts Посмотреть сообщение
но они же тоже когда-то с чего-то начинали
Цитата Сообщение от DrOffset Посмотреть сообщение
Что за ерунда?
Это шутка была, сладкая лесть комплимент в сторону профессионалов (это то же лесть комплимент )
0
25.07.2020, 13:14

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Вот именно книгу Мейерса сначала и нужно читать по этой теме.
Да, это именно та книга, которая может разложить всё по полочкам.

0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.07.2020, 13:16
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот именно книгу Мейерса сначала и нужно читать по этой теме. А потом уже всякие статьи и т.п.
Цитата Сообщение от Croessmah Посмотреть сообщение
Да, это именно та книга, которая может разложить всё по полочкам.
не согласен, с первой ссылки которую я скинул будет полезно начать.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
25.07.2020, 17:14  [ТС]
_stanislav, в книге той которую Вы мне посоветовали там о move семантике в основном, там нету о prvalue и тд
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.07.2020, 17:23
Цитата Сообщение от Vanconts Посмотреть сообщение
там нету о prvalue
тебе нужно понять эту картинку и все:
за один день не получиться все в мозгу устаканить, ясно?
Миниатюры
Rvalue и lvalue  
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.07.2020, 17:24
Вложение 1168840
Изображения
 
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.07.2020, 17:25
я тут скинул не ту карту сокровишь сори
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
25.07.2020, 17:45  [ТС]
_stanislav, Вот есть lvalue - это выражения которые имеют и адрес и значение, rvalue - выражения без адреса.
Вроде бы понятно , литерал не будет иметь адреса в памяти процеса, но если взять анонимный объект
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
class c {
public:
    c() :a(0) { std::cout << "simple constructor\n"; }
    c(int a) :a(a) { std::cout << "int constructor\n"; }
 
 
    ~c() { std::cout << "destructor\n"; }
    
    int a;
};
 
 
int main()
{
    c();
}
он же конструируется , у него же должен быть адрес и значение , разве нет?

Добавлено через 1 минуту
И еще почему ссылки это всегда lvalue?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.07.2020, 17:49
Цитата Сообщение от Vanconts Посмотреть сообщение
И еще почему ссылки это всегда lvalue?
почему пузатые сначала пишут законы, а потом под эти законы тоже пишут законы?, это в России.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
25.07.2020, 17:51  [ТС]
_stanislav,
Цитата Сообщение от _stanislav Посмотреть сообщение
почему пузатые сначала пишут законы, а потом под эти законы тоже пишут законы?, это в России.

Не по теме:

такое не только в России)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.07.2020, 17:51
Помогаю со студенческими работами здесь

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

Непонятное поведение rvalue/lvalue
Всем привет, объясните, пожалуйста, немного про р-вэлью и л-вэлью в этом коде: #include &lt;iostream&gt; using namespace std; void...

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru