|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
rvalue ссылки17.12.2019, 11:36. Показов 8493. Ответов 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
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||||
| 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
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||
| 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
|
|||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 18.12.2019, 12:59 | ||
|
0
|
||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
||||||
| 18.12.2019, 13:01 [ТС] | ||||||
|
DrOffset, окей, Вы не подскажете как вызвать подобный оператор?
0
|
||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||||||||
| 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
|
||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||
| 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
|
|||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||
| 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
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 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 значения/ссылки
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция 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
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|