|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
rvalue ссылки17.12.2019, 11:36. Показов 8849. Ответов 93
Метки нет (Все метки)
1
|
|
| 17.12.2019, 11:36 | |
|
Ответы с готовыми решениями:
93
Зачем нужны rvalue ссылки, если есть универсальные ссылки Ссылки от rvalue
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 18.12.2019, 12:43 | |||
|
потому что их там два. первый - обычный конструктор копирования, участвуют в строительстве временного объекта. второй - референсный. используется при строительстве результирующиего объекта. и когда ты пишешь: почему же не подходит? подходит. и подходит, и используется. https://rextester.com/SMMF10447
0
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||||||
| 18.12.2019, 12:43 | ||||||||
|
А там есть еще один конструктор который выглядит так:
0
|
||||||||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 18.12.2019, 12:47 [ТС] | |
|
DrOffset, после прочтения главы мне должно стать понятно почему тут вызывается оператор ?
Добавлено через 2 минуты DrOffset, просто слегка непонятно какую связь имеет operator auto_ptr_ref<_Other>() и rvalue ссылки ,почему вызывается именно он?
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||||
| 18.12.2019, 12:52 | ||||||
|
Добавлено через 4 минуты Про rvalue ссылки пока сейчас не думайте. Потому что в классе есть другой конструктор, который принимает auto_ptr_ref<_Ty> и преобразование к auto_ptr_ref<_Other> (где _Other = _Ty) это единственный способ скомпилировать этот код.
0
|
||||||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|||||||
| 18.12.2019, 12:55 [ТС] | |||||||
|
DrOffset, насколько я понял то во время
Добавлено через 2 минуты
0
|
|||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 18.12.2019, 12:59 | ||
|
0
|
||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
||||||
| 18.12.2019, 13:01 [ТС] | ||||||
|
DrOffset, окей, Вы не подскажете как вызвать подобный оператор?
0
|
||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||||||||
| 18.12.2019, 13:07 | |||||||||||||
|
из-за того, что * у нас конструктор копирования принимает lvalue-ссылку * и в наличии другой конструктор, который принимает auto_ptr_ref по значению, у нас созданы такие условия, когда инициализация объекта выражением rvalue подходит для использования этого неявного каста. Добавлено через 1 минуту
0
|
|||||||||||||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
||||||
| 18.12.2019, 13:29 [ТС] | ||||||
|
DrOffset, тоесть
Я слегка запутался
0
|
||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||
| 18.12.2019, 13:48 | ||||
Сообщение было отмечено ReYalp как решение
РешениеОн вызывается потому что есть такой конструктор, который может принять auto_ptr_ref и потому что конструктор копирования не подходит. Т.е. два критерия.Вы уже собственно увидели одно из главных недостатков этого: это запутывает. Первая проблема (я надеюсь вы ее увидели, потому что ничего об этом не сказали и не спросили). Когда мы делаем инициализации p1 lvalue-объектом у нас срабатывает конструктор копирования. Но при этом у нас не происходит копирования. У нас происходит перемещение владения указателем из объекта p в объект p1. Т.е. по семантике мы делаем копирование, а по факту - перемещение. Это плохо тем, что запутывает читающего код.Вторая проблема: когда у нас копирование может быть безопасно заменено на перемещение? Правильно, когда объект временный и данные ему все равно уже не нужны. Но тут старая редакция С++ вставляет палки в колеса. У нас нет возможности так просто отобрать владение у временного объекта. К lvalue-ссылке он не привязывается, а через константную ссылку объект не изменить (ну всякие хаки с конст_кастами и mutable оставим за скобками). Поэтому рождается вот такой запутанный код. Итак в этом коде - конструктор от аргумента auto_ptr_ref - это прото-(в археологическом смысле)-конструктор перемещения. Сам auto_ptr_ref - это прото-rvalue-ссылка.Собственно ответ на первы вопрос: явно предполагает наличие перемещения ресурса от объекта к объекту.p1 инициализуется p и вопрос по поводу состояния p получает явный ответ. И в коде становится заметно, что здесь у нас семантика перемещения, а не копирования.
1
|
||||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|||||||
| 18.12.2019, 14:00 [ТС] | |||||||
|
DrOffset, у меня появилась проблема ,я не могу отобразить работу данной ситуации в более простом примере ,помогите пожалуйста ,что нужно поменять\дописать?
Добавлено через 2 минуты hoggy,
0
|
|||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||
| 18.12.2019, 14:11 | |||||||
|
Получаем тип test<double> и тип test<int>. Если между ними попробовать провести копирование, то ничего не выйдет. Это два разных типа, они не умеют копироваться друг в друга. Но, если мы напишем пользовательский оператор преобразования, то это станет возможным. Когда мы пишем
Таким образом, если вы мысленно подставите вместо AA=double, то получите test<double> - это то, что у нас с левой стороны. Компилятор делает тоже самое. Он видит тип с левой стороны - test<double>, видит оператор преобразования в test<AA>, подставляет AA=double, и получает успешную подстановку. Код компилируется.
0
|
|||||||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 18.12.2019, 14:18 [ТС] | |
|
DrOffset, у меня много вопросов 1. Если брать мой код то почему перед выховод оператора не срабатывает конструктор b? 2. Оператор возвращает значения но оно получается что никуда не приравнивается?
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 18.12.2019, 14:24 | |||
|
Вот тут я отключил это: https://rextester.com/TJQVM58449 Можно увидеть, что делается по семантике (с++14).
0
|
|||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
||||||
| 18.12.2019, 14:40 [ТС] | ||||||
|
DrOffset, можете объяснить как это работает?
если убрать std::endl в операторе и в func то в операторе a будет иметь непонятное значение,если добавить << std::endl то все ок?
0
|
||||||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
||||||
| 18.12.2019, 14:52 [ТС] | ||||||
|
DrOffset, почему в таком случае не срабатывает оператор , а срабатывает конструктор?
Кликните здесь для просмотра всего текста
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 18.12.2019, 14:56 | |||||||
|
в этом примере он вообще никак не используется. убери его - результат не измениться.
0
|
|||||||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 18.12.2019, 15:04 [ТС] | |
|
hoggy, та я понимаю что он не используется ,вот и спрашиваю почему
Добавлено через 3 минуты если взять данный пример то зачем такой оператор нужен? И как его вызвать
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 18.12.2019, 15:07 | |||
|
ты же не используешь форточку, если тебе в принципе не нужно открывать окошко. зачем вообще нужен пользовательский оператор приведения? в каких случаях, и для каких целей он используется?
1
|
|||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
||||||
| 18.12.2019, 15:14 [ТС] | ||||||
|
hoggy, вот , если взять такой пример
Но почему это работает и в случае конструктора в Widget(int)? Добавлено через 59 секунд если я правильно понял то существует тогда 2 варианта преобразование типов ? С помощью конструкторов и операторов ? Или как
0
|
||||||
| 18.12.2019, 15:14 | |
|
Rvalue и lvalue ссылки
Запретить initializer-list конструктору принимать rvalue значения/ссылки
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Книги по геймдизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|