Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, 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
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.