C++ rvalue присваивание объекта

231
05 сентября 2021, 04:30

Работаю с std::list Есть класс TTimerData (с методами) который надо поместить в лист

class TTimerData 
{
  public:
  float tick1_ON; 
  float tick2_OFF; 
  uint32_t time_on; 
  TTimerData(float ptick1_ON,   float ptick2_OFF, uint32_t ptime_on);
};

С этой целью пишу:

std::list<TTimerData> lst;
TTimerData * a=new TTimerData(0,0,11);
lst.push_back(a);

Компилятор на меня злобно ругается и говорит что я передал неверный тип.

lst.push_back(TTimerData(0,0,11));

На такую запись компилятор не ругается - но при этом создается временный объект в стеке. При удалении TTimerData из list должен сработать деструктор и должно вызваться освобождение памяти - что наверно может привести к ошибке.

В заголовке метод push_back определен так: "При подстановке value_type = TTimerData"

 void push_back(const value_type& __x)
 void  push_back(value_type&& __x)

Вопрос: Подскажите пожалуйста как правильно в метод push_back передать значение new TTimerData(0,0,11) ? Или можно все таки использовать временный объект в стеке?

Answer 1

В библиотеке list (версия для arduino) метод push_back определен следующим образом:

void push_back(const value_type& __x)
void  push_back(value_type&& __x)

Для определения метода:

void push_back(const value_type& __x)

подходит следующий вызов:

   TTimerData * a = new TTimerData(0,0,11);
   lst.push_back(*a);
   lst.push_back( *(new TTimerData(0,0,11)));

Для определения метода:

void  push_back(value_type&& __x)

Применяется вызов:

lst.push_back(TTimerData(0,0,11));

Вот тут: https://stackoverflow.com/questions/535223/why-cant-i-push-this-object-onto-my-stdlist Matt написал:

Обратите внимание, что TTimerData будет скопирован в ваш список; неявно сгенерированный конструктор копирования TTimerData (поскольку вы не объявили конструктор TTimerData (const TTimerData и др.) в своем классе, компилятор сделал это за вас) скопирует TTimerData.tick1_ON и TTimerData.tick2_OFF в список. В этом случае это нормально. Размер TTimerData мал, поэтому затраты на копирование невелики и содержат только три целых числа, так что копирование целых значений в порядке.

READ ALSO
jQuery получение параметра по id в ASP.NET MVC

jQuery получение параметра по id в ASP.NET MVC

Хочу получить текстовое содержимое по id, например получить "6000118":

122
Заполнение двумерного массива вихрем

Заполнение двумерного массива вихрем

Имеется массив n*n, необходимо его заполнить вихрем, те

239
Данные в select&#39;e не отображаются

Данные в select'e не отображаются

Подскажите, делаю запрос к AD и через консоль вижу все данные, но если пытаюсь добавить в select, то пишет ошибка, где я накосячил с кодом? Может...

197
Ошибка - Привязка SOAP 1.1 не найдена

Ошибка - Привязка SOAP 1.1 не найдена

Пытаюсь преобразовать WSDL в классы C# командой wsdl mainwsdl /l:C#, содержимое main

267