Re[5]: Правомерно ли такое
От: rg45 СССР  
Дата: 31.08.20 08:08
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Здравствуйте, watchmaker, Вы писали:


W>>Здравствуйте, Шахтер, Вы писали:



Ш>>>Нет. Возвращаемое значение должно быть rvalue.


Ш>>>Коряво.


W>>Коряво? Криво? Легко использовать неверно в другом контексте?

W>>Вот с этим можно согласится.
W>>А то, что "возвращаемое значение должно быть rvalue" — это выдумка. Нет такого требования, конечно же

Ш>ТС хотел сделать


Ш>
Ш>inline
Ш>std::vector<int> makeVec( int i )
Ш>{
Ш>  std::vector<int> ret;

Ш>  ret.push_back(i);

Ш>  return ret;
Ш>}
Ш>


Ш>Только записать в одну строку. Здесь хочется move в return. Для этого нужно rvalue.


Ш>
Ш>inline
Ш>std::vector<int> makeVec( int i )
Ш>{
Ш>    return push_back_helper( std::vector<int>(), i );
Ш>}
Ш>


Ш>Иначе будет копирование.


  Скрытый текст
Ш>
Ш>struct Vect
Ш> {
Ш>  int val = 0 ;

Ш>  Vect() {}

Ш>  Vect(const Vect &obj) : val(obj.val) { Printf(Con,"copy\n"); }

Ш>  Vect(const Vect &&obj) : val(obj.val) { Printf(Con,"move\n"); }

Ш>  void push_back(int v) { val=v; }
Ш> };

Ш>inline
Ш>Vect & push_back_helper( Vect &&v, int elem )
Ш>{
Ш>    v.push_back(elem);

Ш>    return v;
Ш>}

Ш>inline
Ш>Vect makeVec1( int i )
Ш>{
Ш>    Vect ret;

Ш>    ret.push_back(i);

Ш>    return ret;
Ш>}

Ш>inline
Ш>Vect makeVec2( int i )
Ш>{
Ш>    return push_back_helper(Vect(),i);
Ш>}

Ш>struct VectorInit : public Vect
Ш> {
Ш>  template <class Func>
Ш>  VectorInit(Func func) { func((Vect &)*this); }
Ш> };

Ш>/* Main() */

Ш>void Main()
Ш> {
Ш>  {
Ш>   auto v = makeVec1( 3 );

Ш>   Printf(Con,"#;\n",v.val);
Ш>  }
Ш>  {
Ш>   auto v = makeVec2( 3 );

Ш>   Printf(Con,"#;\n",v.val);
Ш>  }
Ш>  {
Ш>   VectorInit v( [] (Vect &v) { v.push_back(3); } );

Ш>   Printf(Con,"#;\n",v.val);
Ш>  }
Ш> }
Ш>


Ш>Печатает


Ш>

Ш>3
Ш>copy
Ш>3
Ш>3



Только получается все наоборот: копирование возникает как раз в makeVec2, тогда как в makeVec1 нет ни copy, ни move, благодаря Mandatory elision of copy/move operations:

http://coliru.stacked-crooked.com/a/41d9f2ef3cf44c99
--
Re[16]: Правомерно ли такое
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 09.09.20 13:29
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, ollv, Вы писали:


O>> А вот я не сказал бы. Особенно, если на рекурсивном движке построены нетривиальные вычисления, это далеко не элементарная (кстати как там элементарная — не значит несложная) задача.


TB>{} вокруг foo

это слишком примитивное представление о переделке рекурсивного

TB>Я про стековые объекты

А стековый объект не может держать ресурс ? Вопрос в том, что он будет делать ? Везде делать using ?

O>> Просто, как бы мы обсуждаем язык со своей уже success story. А победителей не расстреливают ))


TB>Кобол, Паладин, С++...

Да, заметь, работают
У С++ вполне устоявшийся рынок задач, куда всяким шарпам и джавам вход воспрещен (пока) . С развитием llvm технологий может еще территорий добавиться
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.