Size: a a a

2021 March 06

N

Neargye in pro.cxx
Vladislav Gordievskiy
Теперь вопрос - а можно это как-то пофиксить?
return std::move(response.m_msg);
если я правильно понял твой вопрос
источник

VG

Vladislav Gordievski... in pro.cxx
или std::move(response).m_msg
источник

AA

Artur Apshev in pro.cxx
Vladislav Gordievskiy
Теперь вопрос - а можно это как-то пофиксить?
А что не так?
источник

VG

Vladislav Gordievski... in pro.cxx
Да простят меня админы - я просто делаю блог о C++ (в моем профиле ссылка) и собираю реальные таски с собесов в Германии. Хотел посмотреть разницу между нашими прогерами и их) В англоязычном дискорде пока все сдались). Часть задач открыта, a за другие я прошу быть моим патроном на патреоне (я убил уже полгода на это)
источник

VG

Vladislav Gordievski... in pro.cxx
Artur Apshev
А что не так?
Это избыточное копирование
источник

VG

Vladislav Gordievski... in pro.cxx
Главная проблемма тут что NRVO на мемберах не работает (и похоже не будет из коробки, по пропозолам в стандрат)
источник

ПК

Побитый Кирпич... in pro.cxx
У тебя тут проблема ещё  в том что типы разные, это вроде автоматический мув даже блочит
источник

VG

Vladislav Gordievski... in pro.cxx
Там мува нет
источник

VG

Vladislav Gordievski... in pro.cxx
там if
источник

ПК

Побитый Кирпич... in pro.cxx
И что?
источник

ПК

Побитый Кирпич... in pro.cxx
m_msg не мувается из функции
источник

VG

Vladislav Gordievski... in pro.cxx
RVO + NRVO не будет, а так как объект lvalue то и мембуры его lvalue
источник

VG

Vladislav Gordievski... in pro.cxx
просто напиши свой тип всмето std::string
источник

VG

Vladislav Gordievski... in pro.cxx
Например такой
источник

VG

Vladislav Gordievski... in pro.cxx
class Data
{
   int m_p;
public:

   Data(int p = 0)
    : m_p(p)
   {
       std::printf("Data(int) - [%d]\n", m_p);
   }

   Data(const Data& rha)
    : m_p(rha.m_p)
   {
       std::printf("Data(const Data&) - [%d]\n", m_p);
   }

   Data(Data&& rha)
    : m_p(std::move(rha.m_p))
   {
       std::printf("Data(Data&&) - [%d]\n", m_p);
       rha.m_p *= -1;
   }

   Data& operator=(const Data& rha)
   {
       std::printf("Data::operator=(const Data&) - [%d]\n", m_p);
       if (this == &rha)
       {
           return *this;
       }
       m_p = rha.m_p;
       return *this;
   }

   Data& operator=(Data&& rha)
   {
       std::printf("Data::operator=(Data&&) - [%d]\n", m_p);
       if (this == &rha)
       {
           return *this;
       }
       m_p = std::move(rha.m_p);
       rha.m_p *= -1;
       return *this;
   }

   ~Data()
   {
       std::printf("~Data - [%d]\n", m_p);
   }

};
источник

VG

Vladislav Gordievski... in pro.cxx
та же херня
источник

VG

Vladislav Gordievski... in pro.cxx
if - отменяет NRVO и мы получаем lvalue ссылку на мембер
источник

ПК

Побитый Кирпич... in pro.cxx
Vladislav Gordievskiy
class Data
{
   int m_p;
public:

   Data(int p = 0)
    : m_p(p)
   {
       std::printf("Data(int) - [%d]\n", m_p);
   }

   Data(const Data& rha)
    : m_p(rha.m_p)
   {
       std::printf("Data(const Data&) - [%d]\n", m_p);
   }

   Data(Data&& rha)
    : m_p(std::move(rha.m_p))
   {
       std::printf("Data(Data&&) - [%d]\n", m_p);
       rha.m_p *= -1;
   }

   Data& operator=(const Data& rha)
   {
       std::printf("Data::operator=(const Data&) - [%d]\n", m_p);
       if (this == &rha)
       {
           return *this;
       }
       m_p = rha.m_p;
       return *this;
   }

   Data& operator=(Data&& rha)
   {
       std::printf("Data::operator=(Data&&) - [%d]\n", m_p);
       if (this == &rha)
       {
           return *this;
       }
       m_p = std::move(rha.m_p);
       rha.m_p *= -1;
       return *this;
   }

   ~Data()
   {
       std::printf("~Data - [%d]\n", m_p);
   }

};
return boost::make_optional(std::move(response.m_msg));

Вот так вот будет мув работать
источник

VG

Vladislav Gordievski... in pro.cxx
и так тоже std::move(response).m_msg
источник

ПК

Побитый Кирпич... in pro.cxx
Дак в чем вопрос7
источник