c ++ Как передать ссылку rvalue на другую функцию - PullRequest
1 голос
/ 06 мая 2020

Я использую встроенную библиотеку с шаблонами с etl::queue

https://www.etlcpp.com/queue.html

etl::queue не имеет значения std::queue

Чтобы избежать копирования, я бы хотел переместить элемент в очередь.

Теперь моя настройка выглядит так

  bool CETLConcurrentQueue<ElementType_T, u32QueueSize>::Add(ElementType_T &&element, const uint32_t u32Timeout)
{
   //lock mutex...
   queue.push(element);
   //do further stuff
}

Теперь я не использую queue.push(std::move(element)); поскольку элемент уже является rvalue Ссылка

Однако queue.push(element); вызывает конструктор копирования элементов (который удаляется). Как я могу вместо этого вызвать конструктор перемещения элементов?

1 Ответ

5 голосов
/ 06 мая 2020

Вы должны использовать std::move для преобразования element в rvalue. Поскольку именованная переменная element сама по себе является lvalue, даже ее тип является ссылкой на rvalue.

queue.push(std::move(element));

Обратите внимание, что типы и категории значений - две независимые вещи.

(курсив мой)

Каждое выражение C ++ (оператор с его операндами, литерал, имя переменной и т. Д. c.) Характеризуется двумя независимыми свойствами: a тип и категория значения .

...

Следующие выражения являются выражениями lvalue:

  • имя переменной, функции , a template parameter object (since C++20) или элемента данных, независимо от типа, например std::cin или std::endl. Даже если тип переменной является ссылкой rvalue, выражение, состоящее из его имени, будет выражением lvalue ;
...