Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. Я пробовал в функции OpenBinFileForWrite принимать по rvalue- ссылке &&. Но все равно получаю ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2018, 10:14 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
Если вместо: Код: plaintext 1. написать: Код: plaintext 1. 2. то все работает. Причем принимающая функция берет хоть по значению, хоть по правой ссылке- работает... Я правильно понимаю: Правая ссылка- это точно такая же ссылка, как и левая, только для временных объектов. Поэтому при ее использовании передача управления произойдет не в момент вызова метода OpenBinFileForWrite, а в момент, когда в методе произойдет явная передача управления. В противном случае (прием в методе по значению) при инициализации параметров метода OpenBinFileForWrite сразу произойдет передача управления и старый объект разрушится. ??? p.s. На просторах интернета нет ни одной нормальной русскоязычной информации по правым ссылкам. Все они друг другу противоречат и рассматривают какие- то частности, а не простые, но фундаментальные вопросы, как передача временного значения в функцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2018, 10:47 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. Я пробовал в функции OpenBinFileForWrite принимать по rvalue- ссылке &&. Но все равно получаю ошибки. Ты круглые скобки у make_unique, случаем, не забыл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2018, 10:51 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
NekZ, спасибо, меня просто подсказка напугала (после ввода круглых скобок я получал подчеркивание и подсказку "слишком мало параметров"). Так работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2018, 11:06 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, А вот напиши ты тип явно std::unique_ptr<std::ofstream>, то сразу бы понял в чём ошибка ;-) В этом недостаток auto, так что будь внимателен, когда используешь его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2018, 11:10 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЯ правильно понимаю: Правая ссылка- это точно такая же ссылка, как и левая, только для временных объектов. Поэтому при ее использовании передача управления произойдет не в момент вызова метода OpenBinFileForWrite, а в момент, когда в методе произойдет явная передача управления. В противном случае (прием в методе по значению) при инициализации параметров метода OpenBinFileForWrite сразу произойдет передача управления и старый объект разрушится. ??? Теперь я все понял! Так работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. А так НЕ работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Другими словами, правые ссылки позволяет передать временное значение без вызовов конструктора перемещения и/ или перемещающего оператора присваивания. А значит исходная переменная не зануляется. Вот зачем они нужны!!! Этого вы нигде не прочитаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2018, 11:19 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLДругими словами, правые ссылки позволяет передать временное значение без вызовов конструктора перемещения и/ или перемещающего оператора присваивания. А значит исходная переменная не зануляется . Значение не зануляется самим фактом передачи ссылки. Но если вы передали rv-ссылку в функцию, то вы уже не можете рассчитывать что значение сохранится. Хотя конечно никто не обязывает функцию что либо делать с переданным значением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2018, 11:39 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЗначение не зануляется самим фактом передачи ссылки. Но если вы передали rv-ссылку в функцию, то вы уже не можете рассчитывать что значение сохранится. Хотя конечно никто не обязывает функцию что либо делать с переданным значением. В том- то и фишка: 1. Если принимаем по значению, то будет вызван оператор перемещающего копирования, который как правило переданный в него параметр зануляет (освобождает ресурсы). Т.е. зануление происходит ВСЕГДА. 2. Если мы принимаем по правой ссылке, то это по смыслу тоже самое, как передать обычный указатель или обычную ссылку (которые сами передаются по значению). При этом передается адрес, а не сама переменная, поэтому никаких конструкторов не вызывается и потому переданная переменная не теряет значение из-за действий конструктора. Т.е. зануление происходит, если в принимающей функции (или передавая ниже по стеку) мы явно вызовем перемещения. Для некопируемых (но перемещаемых) объектов это очень важно: их нужно отдавать в функции как правые ссылки (с помощью std::move), принимать как правые ссылки (с помощью &&), но в принимающей функции ни в коем случае не перемещать: потому что по сути мы работаем с исходной переменной и ее перемещение занулит исходную переменную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2018, 18:32 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, && и & ссылки ничем не отличаются на принимающей стороне. Разница только в том, что туда можно передать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2018, 18:44 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyAlekseySQL, && и & ссылки ничем не отличаются на принимающей стороне. Разница только в том, что туда можно передать. Ок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2018, 08:21 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyAlekseySQL, && и & ссылки ничем не отличаются на принимающей стороне. Разница только в том, что туда можно передать. Если принимать по константной ссылке (как левой, так и правой), то программа тоже работает без ошибок. Какую ссылку лучше выбрать, если принимающая сторона работает с константным объектом? По логике лучше прямо это показать, использую левую ссылку: правые для изменений, левые для константных объектов. Я прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2018, 08:40 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyAlekseySQL, && и & ссылки ничем не отличаются на принимающей стороне. Разница только в том, что туда можно передать. Если принимать по константной ссылке (как левой, так и правой), то программа тоже работает без ошибок. Какую ссылку лучше выбрать, если принимающая сторона работает с константным объектом? По логике лучше прямо это показать, использую левую ссылку: правые для изменений, левые для константных объектов. Я прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2018, 15:07 |
|
||
|
move- семантика: как передать unique_ptr?
|
|||
|---|---|---|---|
|
#18+
NekZВ этом недостаток auto, так что будь внимателен, когда используешь его.не надо использовать auto где попало. Он сделан не для того, чтобы сокращать длинные декларации. Для этого есть using, надо использовать его. Уже не первый раз тут(и не тут) пишут про ошибки, которые возникли из-за того, что автор использовал auto, чтобы "упростить" код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 05:35 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39638641&tid=2017872]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 316ms |
| total: | 458ms |

| 0 / 0 |
