&& member?
От: удусекшл  
Дата: 09.09.21 14:57
Оценка: 2 (2)
Привет!

Что вот это такое?

class SomeClass
{
    Sometype && someMember;
};


Коллега что-то странное хочет замутить, и спрашивает советов. Я заглянул в его код, а там такое. И будто бы даже компилируется
Отредактировано 10.09.2021 8:55 удусекшл . Предыдущая версия .
Re: && member?
От: _NN_ www.nemerleweb.com
Дата: 09.09.21 15:27
Оценка: +2
Здравствуйте, удусекшл, Вы писали:

У>Привет!


У>Что вот это такое?

rvalue reference

У>Коллега что-то странное хочет замутить, и спрашивает советов. Я заглянул в его код, а там такое. И будто бы даже компилируется

Может с этого стоит начать ?
Что получить в итоге нужно-то ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: && member?
От: удусекшл  
Дата: 10.09.21 08:52
Оценка: :))
Здравствуйте, _NN_, Вы писали:

У>>Что вот это такое?

_NN>rvalue reference




У>>Коллега что-то странное хочет замутить, и спрашивает советов. Я заглянул в его код, а там такое. И будто бы даже компилируется

_NN>Может с этого стоит начать ?
_NN>Что получить в итоге нужно-то ?

Коллега недавно устроился, и только начал открывать для себя C++, и C++ 11 в частности. Я не смог от него добиться внятного ответа, что он пытается сделать. А двойной аммперсанд он говорит где-то в инете нарыл, а где — не помнит
Отредактировано 10.09.2021 8:54 удусекшл . Предыдущая версия .
Re[3]: && member?
От: Homunculus Россия  
Дата: 10.09.21 08:53
Оценка: +1 :))) :))) :)))
Здравствуйте, удусекшл, Вы писали:

У>Коллега недавно устроился, и только начал открывать для себя C++, и C++ в частности. Я не смог от него добиться внятного ответа, что он пытается сделать. А двойной аммперсанд он говорит где-то в инете нарыл, а где — не помнит


Ну значит это логическое И между каким-то типом и каким-то членом
Re: && member?
От: rg45 СССР  
Дата: 10.09.21 09:28
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Что вот это такое?


У>
У>class SomeClass
У>{
У>    Sometype && someMember;
У>};
У>


Ты имеешь в виду, какие возможны сценарии использования? Например, такой:

http://coliru.stacked-crooked.com/a/5e9b792990f2f860

#include <iostream>
#include <string>

struct SomeClass
{
    using Sometype = std::string;
    Sometype && someMember;
};

int main()
{
    SomeClass x{"Hello, World!"};

    std::cout << x.someMember << std::endl;

    x.someMember = "Be happy!";

    std::cout << x.someMember << std::endl;
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 10.09.2021 9:46 rg45 . Предыдущая версия . Еще …
Отредактировано 10.09.2021 9:43 rg45 . Предыдущая версия .
Re[2]: && member?
От: Zhendos  
Дата: 10.09.21 10:49
Оценка: +1 :)
Здравствуйте, rg45, Вы писали:


R>Ты имеешь в виду, какие возможны сценарии использования? Например, такой:


Скорее вот такой:

R>
struct SomeClass
{
    using Sometype = std::string;
    Sometype && someMember;
};

SomeClass f()
{
    SomeClass x{"Hello, World!"};
    std::cout << x.someMember << std::endl;
    x.someMember = "Be happy!";
    std::cout << x.someMember << std::endl;
    return x;
}

int main()
{
    auto x = f();
    std::cout << x.someMember << "\n";
}
R>



Hello, World!
Be happy!
>U\0\0


А вот для обычной не константной ссылки компилятор выругается.
Re[3]: && member?
От: rg45 СССР  
Дата: 10.09.21 12:42
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>SomeClass f()

Z>{
Z> SomeClass x{"Hello, World!"};
Z> std::cout << x.someMember << std::endl;
Z> x.someMember = "Be happy!";
Z> std::cout << x.someMember << std::endl;
Z> return x;
Z>}

А "Be happy!" прямо заиграло оттенками в этом варианте
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: && member?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.09.21 18:56
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ты имеешь в виду, какие возможны сценарии использования? Например, такой:


Хз, что имел в виду ТС, но я ничего не понял . В новых стандартах не силен, особенно по части перемещений и подобного. Новые стандарты изучаю по форумам

Ты не мог бы разжевать, что твой пример демонстрирует?
Маньяк Робокряк колесит по городу
Re[4]: && member?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.09.21 18:58
Оценка:
Здравствуйте, rg45, Вы писали:

R>А "Be happy!" прямо заиграло оттенками в этом варианте


Ребята, разжуйте плс, в чем прикол, что делает этот код?
Маньяк Робокряк колесит по городу
Re[5]: && member?
От: T4r4sB Россия  
Дата: 10.09.21 19:17
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>Ребята, разжуйте плс, в чем прикол, что делает этот код?


Одноразовое поле)
После каждого использования оно становится "смувнутым" (для чисел ничего не происходит, для контейнеров — скорее всего возвращается в валидное "пустое" состояние, хотя это не специфицировано)
Re[3]: && member?
От: rg45 СССР  
Дата: 10.09.21 19:25
Оценка: 6 (1)
Здравствуйте, Marty, Вы писали:

M>Ты не мог бы разжевать, что твой пример демонстрирует?


Создание временного объекта типа std::string и продление времени жизни этого объекта при помощи rvalue ссылки, являющейся членом класса.

И еще дополнительно демонстрация отличия rvalue ссылки от константноый lvalue ссылки, с помощью которой также можно продлить время жизни временного объекта. Отличие заключается в возможности модификации временного объекта через rvalue ссылку.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 10.09.2021 19:36 rg45 . Предыдущая версия .
Re[5]: && member?
От: rg45 СССР  
Дата: 10.09.21 19:32
Оценка:
Здравствуйте, Marty, Вы писали:

R>>А "Be happy!" прямо заиграло оттенками в этом варианте


M>Ребята, разжуйте плс, в чем прикол, что делает этот код?


А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 10.09.2021 19:35 rg45 . Предыдущая версия .
Re[6]: && member?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.09.21 20:08
Оценка: :)
Здравствуйте, T4r4sB, Вы писали:

M>>Ребята, разжуйте плс, в чем прикол, что делает этот код?


TB>Одноразовое поле)

TB>После каждого использования оно становится "смувнутым" (для чисел ничего не происходит, для контейнеров — скорее всего возвращается в валидное "пустое" состояние, хотя это не специфицировано)

Всё равно не понял Я хоть auto и лямбды освоил, всё равно 03шник
Маньяк Робокряк колесит по городу
Re[6]: && member?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.09.21 20:09
Оценка:
Здравствуйте, rg45, Вы писали:

R>>>А "Be happy!" прямо заиграло оттенками в этом варианте


M>>Ребята, разжуйте плс, в чем прикол, что делает этот код?


R>А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.


Сорян за затупанство, но можно поподробнее, что на каждом шаге происходит?
Маньяк Робокряк колесит по городу
Re[7]: && member?
От: T4r4sB Россия  
Дата: 10.09.21 20:51
Оценка:
Здравствуйте, Marty, Вы писали:

M>Всё равно не понял Я хоть auto и лямбды освоил, всё равно 03шник


Ну мув же.
Это придумали чтоб объект передать в функцию, указав, что тебе этот объект дальше не понадобился.
Ну свап-то тебе знаком? В ++03 вроде как часто использовался.
Типа ты строку передал в вектор строк, чтоб запушить, и она не скопировалась в конец вектора, а как бы свапнулась с пустой строкой. В итоге твоя исходная строка стала пустой, а в векторе — строка, владеющая тем буфером, который изначально был в твоей исходной строке.
Никогда мув не видел? Как без него можно эффективно использовать СТЛ?
Re[8]: && member?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.09.21 22:14
Оценка:
Здравствуйте, T4r4sB, Вы писали:

M>>Всё равно не понял Я хоть auto и лямбды освоил, всё равно 03шник


TB>Ну мув же.

TB>Это придумали чтоб объект передать в функцию, указав, что тебе этот объект дальше не понадобился.
TB>Ну свап-то тебе знаком? В ++03 вроде как часто использовался.

Со свапом нет проблем, там всё 03ее


TB>Типа ты строку передал в вектор строк, чтоб запушить, и она не скопировалась в конец вектора, а как бы свапнулась с пустой строкой. В итоге твоя исходная строка стала пустой, а в векторе — строка, владеющая тем буфером, который изначально был в твоей исходной строке.


Да, это я понимаю


TB>Никогда мув не видел?


Типа того, да.


TB>Как без него можно эффективно использовать СТЛ?


Без него работало же вполне норм


Правда, я не понял, как твои комемнтарии помогут мне понять, что происходит в представленных примерах

Если не сложно разжевать, разжуй, плс. Ну, так, чтобы для совсем тупых
Маньяк Робокряк колесит по городу
Re[9]: && member?
От: T4r4sB Россия  
Дата: 10.09.21 22:19
Оценка:
Здравствуйте, Marty, Вы писали:

TB>>Как без него можно эффективно использовать СТЛ?


M>Без него работало же вполне норм


Тормозило, если не выкручиваться левыми путями.

M>Если не сложно разжевать, разжуй, плс. Ну, так, чтобы для совсем тупых


Любая операция над полем мувает его. Свапает с пустым объектом.
Re[10]: && member?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.09.21 22:25
Оценка:
Здравствуйте, T4r4sB, Вы писали:

M>>Если не сложно разжевать, разжуй, плс. Ну, так, чтобы для совсем тупых


TB>Любая операция над полем мувает его. Свапает с пустым объектом.



Намёк почти понял, но пошаговую разжевку всё равно хочу
Маньяк Робокряк колесит по городу
Re[7]: && member?
От: rg45 СССР  
Дата: 11.09.21 08:38
Оценка:
Здравствуйте, Marty, Вы писали:

R>>А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.


M>Сорян за затупанство, но можно поподробнее, что на каждом шаге происходит?


Подробнее можно почитать здесь: https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary.

А 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
Автор: vng
Дата: 22.08.21
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 11.09.2021 8:42 rg45 . Предыдущая версия .
Re[8]: && member?
От: rg45 СССР  
Дата: 11.09.21 08:58
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Ну мув же.


Даже если мув и есть, то он формальный. Фактически образуется две разные ссылки (по одной в каждом объекте) на один и тот же временный объект. Кроме того, начиная C++17, применяется гарантированный copy/move elision. В этом случае образуется только один объект и мува уже нет. Этот код будет работать даже если мы каким-то способом запретим в классе SomeClass копирование и перемещение. Но проблема при этом все равно не уйдет. Просто нет у нас способа продлить время жизни временного объекта, созданного внутри функции после выхода из этой функции. Вот здесь
Автор: rg45
Дата: 11.09.21
более подробно.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 11.09.2021 10:03 rg45 . Предыдущая версия . Еще …
Отредактировано 11.09.2021 9:37 rg45 . Предыдущая версия .
Отредактировано 11.09.2021 9:36 rg45 . Предыдущая версия .
Отредактировано 11.09.2021 9:35 rg45 . Предыдущая версия .
Отредактировано 11.09.2021 9:32 rg45 . Предыдущая версия .
Отредактировано 11.09.2021 9:24 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.