Здравствуйте, удусекшл, Вы писали:
У>Привет!
У>Что вот это такое?
rvalue reference
У>Коллега что-то странное хочет замутить, и спрашивает советов. Я заглянул в его код, а там такое. И будто бы даже компилируется
Может с этого стоит начать ?
Что получить в итоге нужно-то ?
Здравствуйте, _NN_, Вы писали:
У>>Что вот это такое? _NN>rvalue reference
У>>Коллега что-то странное хочет замутить, и спрашивает советов. Я заглянул в его код, а там такое. И будто бы даже компилируется _NN>Может с этого стоит начать ? _NN>Что получить в итоге нужно-то ?
Коллега недавно устроился, и только начал открывать для себя C++, и C++ 11 в частности. Я не смог от него добиться внятного ответа, что он пытается сделать. А двойной аммперсанд он говорит где-то в инете нарыл, а где — не помнит
Здравствуйте, удусекшл, Вы писали:
У>Коллега недавно устроился, и только начал открывать для себя C++, и C++ в частности. Я не смог от него добиться внятного ответа, что он пытается сделать. А двойной аммперсанд он говорит где-то в инете нарыл, а где — не помнит
Ну значит это логическое И между каким-то типом и каким-то членом
Здравствуйте, rg45, Вы писали:
R>Ты имеешь в виду, какие возможны сценарии использования? Например, такой:
Хз, что имел в виду ТС, но я ничего не понял . В новых стандартах не силен, особенно по части перемещений и подобного. Новые стандарты изучаю по форумам
Ты не мог бы разжевать, что твой пример демонстрирует?
Здравствуйте, Marty, Вы писали:
M>Ребята, разжуйте плс, в чем прикол, что делает этот код?
Одноразовое поле)
После каждого использования оно становится "смувнутым" (для чисел ничего не происходит, для контейнеров — скорее всего возвращается в валидное "пустое" состояние, хотя это не специфицировано)
Здравствуйте, Marty, Вы писали:
M>Ты не мог бы разжевать, что твой пример демонстрирует?
Создание временного объекта типа std::string и продление времени жизни этого объекта при помощи rvalue ссылки, являющейся членом класса.
И еще дополнительно демонстрация отличия rvalue ссылки от константноый lvalue ссылки, с помощью которой также можно продлить время жизни временного объекта. Отличие заключается в возможности модификации временного объекта через rvalue ссылку.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Marty, Вы писали:
R>>А "Be happy!" прямо заиграло оттенками в этом варианте
M>Ребята, разжуйте плс, в чем прикол, что делает этот код?
А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, T4r4sB, Вы писали:
M>>Ребята, разжуйте плс, в чем прикол, что делает этот код?
TB>Одноразовое поле) TB>После каждого использования оно становится "смувнутым" (для чисел ничего не происходит, для контейнеров — скорее всего возвращается в валидное "пустое" состояние, хотя это не специфицировано)
Всё равно не понял Я хоть auto и лямбды освоил, всё равно 03шник
Здравствуйте, rg45, Вы писали:
R>>>А "Be happy!" прямо заиграло оттенками в этом варианте
M>>Ребята, разжуйте плс, в чем прикол, что делает этот код?
R>А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.
Сорян за затупанство, но можно поподробнее, что на каждом шаге происходит?
Здравствуйте, Marty, Вы писали:
M>Всё равно не понял Я хоть auto и лямбды освоил, всё равно 03шник
Ну мув же.
Это придумали чтоб объект передать в функцию, указав, что тебе этот объект дальше не понадобился.
Ну свап-то тебе знаком? В ++03 вроде как часто использовался.
Типа ты строку передал в вектор строк, чтоб запушить, и она не скопировалась в конец вектора, а как бы свапнулась с пустой строкой. В итоге твоя исходная строка стала пустой, а в векторе — строка, владеющая тем буфером, который изначально был в твоей исходной строке.
Никогда мув не видел? Как без него можно эффективно использовать СТЛ?
Здравствуйте, T4r4sB, Вы писали:
M>>Всё равно не понял Я хоть auto и лямбды освоил, всё равно 03шник
TB>Ну мув же. TB>Это придумали чтоб объект передать в функцию, указав, что тебе этот объект дальше не понадобился. TB>Ну свап-то тебе знаком? В ++03 вроде как часто использовался.
Со свапом нет проблем, там всё 03ее
TB>Типа ты строку передал в вектор строк, чтоб запушить, и она не скопировалась в конец вектора, а как бы свапнулась с пустой строкой. В итоге твоя исходная строка стала пустой, а в векторе — строка, владеющая тем буфером, который изначально был в твоей исходной строке.
Да, это я понимаю
TB>Никогда мув не видел?
Типа того, да.
TB>Как без него можно эффективно использовать СТЛ?
Без него работало же вполне норм
Правда, я не понял, как твои комемнтарии помогут мне понять, что происходит в представленных примерах
Если не сложно разжевать, разжуй, плс. Ну, так, чтобы для совсем тупых
Здравствуйте, T4r4sB, Вы писали:
M>>Если не сложно разжевать, разжуй, плс. Ну, так, чтобы для совсем тупых
TB>Любая операция над полем мувает его. Свапает с пустым объектом.
Намёк почти понял, но пошаговую разжевку всё равно хочу
Здравствуйте, Marty, Вы писали:
R>>А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.
M>Сорян за затупанство, но можно поподробнее, что на каждом шаге происходит?
А temporary bound to a return value of a function in a return statement is not extended: it is destroyed immediately at the end of the return expression. Such return statement always returns a dangling reference.
То есть, при выходе из функции время жизни временного объекта заканчивается в любом случае. И образуется "висячая" ссылка. И даже использование copy/move elision от этого не спасает.
P.S. В принципе, происходит та же самая фигня, что и при попытке вернуть из функции std::initializer_list. Недавно вот обсуждали: http://rsdn.org/forum/cpp/8076574.1
Даже если мув и есть, то он формальный. Фактически образуется две разные ссылки (по одной в каждом объекте) на один и тот же временный объект. Кроме того, начиная C++17, применяется гарантированный copy/move elision. В этом случае образуется только один объект и мува уже нет. Этот код будет работать даже если мы каким-то способом запретим в классе SomeClass копирование и перемещение. Но проблема при этом все равно не уйдет. Просто нет у нас способа продлить время жизни временного объекта, созданного внутри функции после выхода из этой функции. Вот здесь