Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 13.12.2019
Сообщений: 47

std::move

16.11.2022, 17:53. Показов 438. Ответов 5

Студворк — интернет-сервис помощи студентам
Есть такой код:

C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    int lol = 2;
 
    int&& p1 = move(lol); //здесь все ок
 
    int&& grind = 10;
 
    int&& f1 = grind; // ошибка компиляции
}
я понимаю почему это ошибка компиляции, ведь слева у нас rvalue ссылка, а справка lvalue(пусть grind и rvalue ссылка, но когда она справа, то выступает как lvalue значение).
C++
1
int&& f1 = grind;
Но разве здесь у нас move не возвращает rvalue ссылку? если он возвращает rvalue ссылку(ну или xvalue), то как переменная p1(будучи rvalue ссылкой) может указывать на результат работы move? если результат работы rvalue ссылка, которая сама по себе lvalue(так как она находится справа и имеет место в памяти).
C++
1
int&& p1 = move(lol);
Если где-то ошибся в рассуждениях, то прошу прощения.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2022, 17:53
Ответы с готовыми решениями:

std::move в Си
Вот какую бы статью про std::move не начинаешь читать в попытке понять, как же работает и в каких случаях нужен std::move, везде пишут, что...

std::move()
Есть ли разница между следующими вещами: A = std::move(B); // and std::copy(B.begin(), B.end(), A.begin()); B.clear();

Std::move
Добрый вечер, #include <iostream> using namespace std; class A { private: int x = 10; public: A(int q){ x = q; }

5
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
16.11.2022, 17:59
Цитата Сообщение от NewFive Посмотреть сообщение
если результат работы rvalue ссылка
"результат работы" - xvalue типа int.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
16.11.2022, 18:21
Лучший ответ Сообщение было отмечено NewFive как решение

Решение

Цитата Сообщение от NewFive Посмотреть сообщение
я понимаю почему это ошибка компиляции, ведь слева у нас rvalue ссылка, а справка lvalue(пусть grind и rvalue ссылка, но когда она справа, то выступает как lvalue значение).
Нет, "справа" здесь ни при чем. Именованная rvalue ссылка - это lvalue. То есть все именованные ссылки одинаковы. Именно именованность ссылки - ключевой момент.

Цитата Сообщение от NewFive Посмотреть сообщение
Но разве здесь у нас move не возвращает rvalue ссылку?
Возвращает. Неименованную rvalue-ссылку. А такая ссылка - это уже xvalue.

Цитата Сообщение от NewFive Посмотреть сообщение
если он возвращает rvalue ссылку(ну или xvalue), то как переменная p1(будучи rvalue ссылкой) может указывать на результат работы move?
А в чем проблема? Rvalue-ссылки прекрасно привязываются к xvalue. Для того они, фактически, и предназначены.

Цитата Сообщение от NewFive Посмотреть сообщение
если результат работы rvalue ссылка, которая сама по себе lvalue(так как она находится справа и имеет место в памяти).
Как я уже сказал выше "находится справа" здесь никакой роли не играет.
1
0 / 0 / 0
Регистрация: 13.12.2019
Сообщений: 47
16.11.2022, 18:36  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, "справа" здесь ни при чем. Именованная value ссылка - это lvalue. То есть все именованные ссылки одинаковы. Именно именованность ссылки - ключевой момент.
понял, буду знать.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Возвращает. Неименованную rvalue-ссылку. А это уже xvalue.
понял, значит я плохо знаком с xvalue, я лишь знаю, что так называемая "исчезающая ссылка" существует до конца выражения.
Но я так понимаю, что мы можем создать переменную типа int, которая является lvalue ссылкой(например int& val), мы можем создать переменную типа int, которая является rvalue ссылкой(например int&& val), но мы не можем создать переменную типа xvalue ?
я верно понимаю, что rvalue ссылка может указывать на xvalue ссылку, так как xvalue ссылка это rvalue ссылка, но без имени ? то есть именно по этой причине rvalue ссылка может указывать на xvalue ссылку.
И если это неименованная rvalue ссылка, то есть ли у неё место в памяти ? по идее есть, ведь она же ссылается(или хранит, не знаю как правильно сказать) значение.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
16.11.2022, 18:57
Цитата Сообщение от NewFive Посмотреть сообщение
Но я так понимаю, что мы можем создать переменную типа int, которая является lvalue ссылкой(например int& val), мы можем создать переменную типа int, которая является rvalue ссылкой(например int&& val), но мы не можем создать переменную типа xvalue ?
Вы путаете тип переменной и категорию выражения.
lvalue ссылка может быть инициализирована выражением lvalue.
rvalue ссылка может быть инициализирована выражением prvalue или xvalue.
"константная" lvalue ссылка может быть инициализированна любым выражением.

Причем, если учитывать неявные преобразования, то можно "напороться" на неочевидные вещи, например:
C++
1
2
3
int i = 0;
float &&rf = i;
int &&ri = rf;
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
16.11.2022, 18:58
Цитата Сообщение от NewFive Посмотреть сообщение
понял, значит я плохо знаком с xvalue, я лишь знаю, что так называемая "исчезающая ссылка" существует до конца выражения.
Но я так понимаю, что мы можем создать переменную типа int, которая является lvalue ссылкой(например int& val),
Это будет не "переменная типа int". Это lvalue-ссылка типа int &.

Цитата Сообщение от NewFive Посмотреть сообщение
мы можем создать переменную типа int, которая является rvalue ссылкой(например int&& val), но мы не можем создать переменную типа xvalue ?
Вы что-то валите разные вещи в одну кучу. Типы ссылок - это одно (rvalue-ссылка и lvalue-ссылка). Категория значения выражения (rvalue, lvalue, xvalue и т.п.) - это другое. Это совершенно разные вещи. Не надо их смешивать.

Не бывает "переменных типа rvaluе", "переменных типа lvaluе" или "переменных типа xvaluе". Это бессмысленные наборы слов. Категории значений применимы только к результатам выражений, а не к переменным.

Цитата Сообщение от NewFive Посмотреть сообщение
я верно понимаю, что rvalue ссылка может указывать на xvalue ссылку,
Нет такого понятия, как "xvalue ссылка".

Правильно: rvalue-ссылку можно проинициализировать при помощи xvalue (т.е. при помощи выражения, возвращающего xvalue).

Цитата Сообщение от NewFive Посмотреть сообщение
так как xvalue ссылка это rvalue ссылка, но без имени ?
Нет такого понятия, как "xvalue ссылка".

"Rvalue ссылка, но без имени" фигурирует только в двух случаях: возвращаемое значение функции, возвращающей rvalue-ссылку, и результат приведения типа к типу rvalue-ссылки.

Цитата Сообщение от NewFive Посмотреть сообщение
И если это неименованная rvalue ссылка, то есть ли у неё место в памяти ? по идее есть, ведь она же ссылается(или хранит, не знаю как правильно сказать) значение.
Стандарт языка не оговаривает, занимают ли ссылки память. Не важно, именованные они или нет. Ссылки не являются объектами в С++.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2022, 18:58
Помогаю со студенческими работами здесь

std::move()
Здравствуйте! Хочу разобраться с функцией std::move(). Код, приведенный ниже работает как и ожидается, значение в переменной str...

emplace и std::move
есть код для чтения кадров с камеры , нахождения лица и вывода этого всего на экран. #include <opencv2/opencv.hpp> #include...

Функция std::move()
struct DotPosition { long x; long y; }; std::vector<DotPosition> dots; DotPosition dot; dot.x = x; dot.y = y; ...

Optional и std::move
добрый день. разбираясь в исходниках optional'а из gcc, я понял, что там нигде не делается инвалидным только что перемещенный объект. ...

Отличие std::move от & ?
Здравствуйте, Подскажите пожалуйста, никак не могу понять, чем принципиально отличается std::move от & ? То есть и то и то...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru