Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/37: Рейтинг темы: голосов - 37, средняя оценка - 4.73
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

rvalue ссылки

17.12.2019, 11:36. Показов 8482. Ответов 93
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Может кто объяснить зачем нужны rvalue ссылки и как правильно работать с std::move и std::forward?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2019, 11:36
Ответы с готовыми решениями:

Зачем нужны rvalue ссылки, если есть универсальные ссылки
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue ссылками. Я не пойму, зачем нужны rvalue ссылки, если есть...

Ссылки от rvalue
Доброго времени суток, господа! Начал читать статью про rvalue ссылки на хабре и что-то много вопросов появилось, вот. void...

Rvalue ссылки
Литературу читаю, но доезжаю медленно(если знаете где доступно описано- напишите),тяжело болею умственной анорексией. 1.Так вот о...

93
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
17.12.2019, 16:56  [ТС]
Студворк — интернет-сервис помощи студентам
_stanislav, сейчас нету особо времени читать) вечером почитай, я хочу для начала еще разобратсья с auto_ptr
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
17.12.2019, 19:33
Уточню один момент: там в комментарии я написал что move вернёт string&&, но до конца не уточнил почему это приводит к вызову конструктора перемещения. Тип выражения std::move(object) - xvalue. данный тип выражения включает в себя свойства rvalue выражения. Результат rvalue можно привязать к rvalue ссылке (тогда и xvalue можно хотя бы потому что оно включает в себя свойства rvalue).

Понимаю что скорее всего я сейчас усложнил вам задачу, но это объяснение точнее предыдущего.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
17.12.2019, 19:55
Undisputed, я думаю, это будет проще понять человеку, если он сначала разберется в чисто бытовой потребности во всем этом. Поэтому и предложил на примере auto_ptr прочувствовать задачу.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
17.12.2019, 20:08
Цитата Сообщение от DrOffset Посмотреть сообщение
я думаю, это будет проще понять человеку, если он сначала разберется в чисто бытовой потребности во всем этом.
Согласен. Я просто постарался объяснить ему на примере строки т.к строка помоему ближе новичкам чем смартпоинтеры
А последнее сообщение было лишь уточнением на будущее как для ТС, так и для других возможных читателей )
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 00:09  [ТС]
Undisputed, не сказал бы, мне, лично, строку тяжелее воспринимать т.к. я давно не использую тип sring и когда его использовал то не разобрался с тем как он устроен, вместо string'а использую либо char * либо аналог чужой аналог string'a, но вряд-ли Вы о нем слышали, так что удобнее было бы с какими-то более понятными типами, к примеру int
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.12.2019, 01:16
Цитата Сообщение от ReYalp Посмотреть сообщение
аналог чужой аналог string'a, но вряд-ли Вы о нем слышали
поделишься кодом?

коллекционирую классы строк.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 10:08  [ТС]
hoggy, не могу, код с работы, извини)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.12.2019, 10:21
Цитата Сообщение от ReYalp Посмотреть сообщение
_stanislav, сейчас нету особо времени читать) вечером почитай, я хочу для начала еще разобратсья с auto_ptr
Забей ты на этот auto_ptr. В те времена просто не было move-семантики, поэтому приходилось извращаться.

Добавлено через 2 минуты
Цитата Сообщение от ReYalp Посмотреть сообщение
Undisputed, не сказал бы, мне, лично, строку тяжелее воспринимать т.к. я давно не использую тип sring и когда его использовал то не разобрался с тем как он устроен, вместо string'а использую либо char * либо аналог чужой аналог string'a, но вряд-ли Вы о нем слышали, так что удобнее было бы с какими-то более понятными типами, к примеру int
Жесть.
std::string это довольно примитивный класс, как-то надо представлять как он работает
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 10:51  [ТС]
oleg-m1973, ну я представляю как он работает т.к. каждый день работаю с его аналогом) просто если именно string в примерах используется то значит в нем есть что-то особенное о чем я не знаю, вот и всё, насчёт auto_ptr мне самому стало интересно, да и сам класс не такой большой чтобы на него было жаль время тратить
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.12.2019, 10:58
Цитата Сообщение от ReYalp Посмотреть сообщение
насчёт auto_ptr мне самому стало интересно, да и сам класс не такой большой чтобы на него было жаль время тратить
Чтобы понять проблематику, тебе просто нужно написать свой smart pointer, типа unique_ptr. Изучать для этого какие-то древние классы не нужно. Изучай современные.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 11:26  [ТС]
DrOffset, Здравствуйте, я вот разбираюсь с auto_ptr и не могу понять что мне должно быть не понятно? Можете дать подсказку в какую сторону смотреть ? Пока что все более чем очевидно

Добавлено через 7 минут
вот код если что
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#if _HAS_AUTO_PTR_ETC
// CLASS TEMPLATE auto_ptr
template<class _Ty>
class auto_ptr;
 
template<class _Ty>
struct auto_ptr_ref
{   // proxy reference for auto_ptr copying
    explicit auto_ptr_ref(_Ty* _Right)
        : _Ref(_Right)
    {   // construct from generic pointer to auto_ptr ptr
    }
 
    _Ty* _Ref;  // generic pointer to auto_ptr ptr
};
 
template<class _Ty>
class auto_ptr
{   // wrap an object pointer to ensure destruction
public:
    typedef _Ty element_type;
 
    explicit auto_ptr(_Ty* _Ptr = nullptr) noexcept
        : _Myptr(_Ptr)
    {   // construct from object pointer
    }
 
    auto_ptr(auto_ptr& _Right) noexcept
        : _Myptr(_Right.release())
    {   // construct by assuming pointer from _Right auto_ptr
    }
 
    auto_ptr(auto_ptr_ref<_Ty> _Right) noexcept
    {   // construct by assuming pointer from _Right auto_ptr_ref
        _Ty* _Ptr = _Right._Ref;
        _Right._Ref = nullptr;  // release old
        _Myptr = _Ptr;  // reset this
    }
 
    template<class _Other>
    operator auto_ptr<_Other>() noexcept
    {   // convert to compatible auto_ptr
        return (auto_ptr<_Other>(*this));
    }
 
    template<class _Other>
    operator auto_ptr_ref<_Other>() noexcept
    {   // convert to compatible auto_ptr_ref
        _Other* _Cvtptr = _Myptr;   // test implicit conversion
        auto_ptr_ref<_Other> _Ans(_Cvtptr);
        _Myptr = nullptr;   // pass ownership to auto_ptr_ref
        return (_Ans);
    }
 
    template<class _Other>
    auto_ptr& operator=(auto_ptr<_Other>& _Right) noexcept
    {   // assign compatible _Right (assume pointer)
        reset(_Right.release());
        return (*this);
    }
 
    template<class _Other>
    auto_ptr(auto_ptr<_Other>& _Right) noexcept
        : _Myptr(_Right.release())
    {   // construct by assuming pointer from _Right
    }
 
    auto_ptr& operator=(auto_ptr& _Right) noexcept
    {   // assign compatible _Right (assume pointer)
        reset(_Right.release());
        return (*this);
    }
 
    auto_ptr& operator=(auto_ptr_ref<_Ty> _Right) noexcept
    {   // assign compatible _Right._Ref (assume pointer)
        _Ty* _Ptr = _Right._Ref;
        _Right._Ref = 0;    // release old
        reset(_Ptr);    // set new
        return (*this);
    }
 
    ~auto_ptr() noexcept
    {   // destroy the object
        delete _Myptr;
    }
 
    _NODISCARD _Ty& operator*() const noexcept
    {   // return designated value
#if _ITERATOR_DEBUG_LEVEL == 2
        _STL_VERIFY(_Myptr, "auto_ptr not dereferencable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
 
        return (*get());
    }
 
    _NODISCARD _Ty* operator->() const noexcept
    {   // return pointer to class object
#if _ITERATOR_DEBUG_LEVEL == 2
        _STL_VERIFY(_Myptr, "auto_ptr not dereferencable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
 
        return (get());
    }
 
    _NODISCARD _Ty* get() const noexcept
    {   // return wrapped pointer
        return (_Myptr);
    }
 
    _Ty* release() noexcept
    {   // return wrapped pointer and give up ownership
        _Ty* _Tmp = _Myptr;
        _Myptr = nullptr;
        return (_Tmp);
    }
 
    void reset(_Ty* _Ptr = nullptr)
    {   // destroy designated object and store new pointer
        if (_Ptr != _Myptr)
            delete _Myptr;
        _Myptr = _Ptr;
    }
 
private:
    _Ty* _Myptr;    // the wrapped object pointer
};
 
template<>
class auto_ptr<void>
{
public:
    typedef void element_type;
};
#endif /* _HAS_AUTO_PTR_ETC */
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 11:35
Цитата Сообщение от ReYalp Посмотреть сообщение
Пока что все более чем очевидно
Возьмите простой пример и ответьте на вопросы (в комментариях)
C++
1
2
3
4
5
6
std::auto_ptr<A> p(new A);
 
std::auto_ptr<A> p1 = p; 
 
// в каком состоянии p теперь?
// какой конструктор сработал в выражении p1 = p?
Добавлено через 2 минуты
Потом возьмите вот такой код (и снова ответьте на вопросы):
C++
1
2
3
4
5
6
7
8
9
std::auto_ptr<A> func()
{
    std::auto_ptr<A> p(new A);
    return p;
}
 
std::auto_ptr<A> p1 = func(); 
 
// какой конструктор сработал в выражении p1 = func()?
Добавлено через 2 минуты
Дальше будут следующие вопросы (открывать только после ответа на предыдущие):
Кликните здесь для просмотра всего текста

Какие недостатки у первого кода?
Почему конструктор копирования имеет такую сигнатуру?
Почему в двух случаях срабатывают разные конструкторы?
Почему нельзя использовать один и тот же конструктор для этого?
Зачем нужен auto_ptr_ref?
2
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 11:49  [ТС]
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
std::auto_ptr<A> p1 = func();
почему в даном случае после возврата поинтера с func срабатывает operator auto_ptr_ref<_Other>() после которого уже срабатывает конструктор ? Откуда берется этот вызов operator auto_ptr_ref<_Other>()?

Добавлено через 6 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
какой конструктор сработал в выражении p1 = func()
с конструкторами все понятно, не понятно только с вызовом оператора
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 12:02
Цитата Сообщение от ReYalp Посмотреть сообщение
Откуда берется этот вызов operator auto_ptr_ref<_Other>()?
Если бы с конструкторами было все понятно, то этого вопроса бы не было.

Ладно. Почему конструктор копирования (который есть у auto_ptr) не подходит в этом случае?
Цитата Сообщение от ReYalp Посмотреть сообщение
C++
1
std::auto_ptr<A> p1 = func();
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.12.2019, 12:17
Цитата Сообщение от DrOffset Посмотреть сообщение
Почему конструктор копирования 9который есть у auto_ptr) не подходит в этом случае?
подходит.
и не просто подходит, а именно что запускается,
успешно отрабатывает, и проблем никаких.

C++
1
2
3
4
    auto_ptr(auto_ptr& _Right) noexcept
        : _Myptr(_Right.release())
        {   // construct by assuming pointer from _Right auto_ptr
        }
другой вопрос: с чего ты вообще взял, что он может не подойти?


тебя смущает, что rvalue не сможет забиндиться на lvalue_reference?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 12:31
Цитата Сообщение от hoggy Посмотреть сообщение
с чего ты вообще взял, что он может не подойти?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
template <typename T>
class auto_ptr
{
public:
    explicit auto_ptr(T * p) : m_ptr(p) 
    { }
    
    auto_ptr(auto_ptr & p) : m_ptr(p.release()) 
    { }
    
    T * release()
    {
        T * p = m_ptr;
        m_ptr = 0;
        return p;
    }
private:
    T * m_ptr;
};
 
auto_ptr<int> foo();
 
int main()
{
    auto_ptr<int> p = foo();
}
https://rextester.com/CFKT97958
source_file.cpp:28:19: error: no matching constructor for initialization of 'auto_ptr<int>'
auto_ptr<int> p = foo();
^ ~~~~~
source_file.cpp:11:5: note: candidate constructor not viable: expects an l-value for 1st argument
auto_ptr(auto_ptr & p) : m_ptr(p.release())
Может ты не будешь мне мешать учить человека, а?

Добавлено через 7 минут

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
тебя смущает, что rvalue не сможет забиндиться на lvalue_reference?
Меня ничего не смущает.
Я человеку даю информацию порционно, с возможность подумать и сделать выводы.
И если я сразу чего-то не говорю, то это специально, в образовательных целях.
Я уверен, что если человеку просто все показать на пальцах, то он через два дня об этом забудет.
Тут на форуме полно примеров таких. Когда ты объясняешь, тратишь время на пост-статью, а через месяц у него тот же вопрос (возможно немного с другой стороны поставленный). Это значит человек суть не понял нифига, а просто запомнил факты. Как только входные условия меняют, у него опять паттерн ломается и он опять ничего не знает.

0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 12:36  [ТС]
DrOffset, у меня срабатывает конструктор после оператора ,другое дело что я не пойму почему вызывается оператор это первое, второе что студия не дает во время дебагинга даже поставить брейкпоинт на оператор auto_ptr , а попытки его вызвать ничего не дают

Добавлено через 3 минуты
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Ладно. Почему конструктор копирования (который есть у auto_ptr) не подходит в этом случае?
я не знаю почему он не подходит и не понимаю этого, вроде все нормально, методн возвращает объект и вроде как его же можно передать в конструктор , но откуда берется вызов operator auto_ptr_ref<_Other>() noexcept я не понимаю и почему именно auto_ptr_ref , а не auto_ptr?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 12:38
Цитата Сообщение от ReYalp Посмотреть сообщение
у меня срабатывает конструктор после оператора
Да, но это не конструктор копирования.

Цитата Сообщение от ReYalp Посмотреть сообщение
другое дело что я не пойму почему вызывается оператор это первое
В ответе на предыдущий вопрос (в #54) скрыт ответ на этот.

Цитата Сообщение от ReYalp Посмотреть сообщение
второе что студия не дает во время дебагинга даже поставить брейкпоинт на оператор auto_ptr
Я бы вам советовал в студии отключить расширения.
https://docs.microsoft.com/ru-... ew=vs-2019
Иначе у вас выстроится искаженная картина происходящего.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 12:40  [ТС]
DrOffset, насколько я понял то func возвращает rvalue? а конструктор принимает на вход lvalue?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 12:41
Цитата Сообщение от ReYalp Посмотреть сообщение
я не знаю почему он не подходит и не понимаю этого
Тут самое время взять книжку "дизайн и эволюция" и почитать главу про ссылки. Выше было об этом упоминание.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.12.2019, 12:41

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

STL и rvalue ссылки
Привет. Помню как-то читал инфу о том, что в стандартных контейнерах rvalue работают, как lvalue. Те имеется ввиду, что имеется два...

RVALUE ссылки и операции с ними
Господа знатоки у меня вопрос следующий. Увидел недавно такую запись &quot;T&amp;&amp; a&quot;, узнал что это rvalue ссылки, вроде как разобрался что это и...

Запретить initializer-list конструктору принимать rvalue значения/ссылки
Здравствуйте! Опишу проблему из заголовка поста на примере... Допустим есть шаблонный класс с initializer-list конструктором: ...

Ссылка на rvalue, является ли она сама rvalue?
А верно ли, что ссылка на rvalue сама не является rvalue? Вот такой код является валидным: #include &lt;iostream&gt; int main() { ...


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru