我使用的是内嵌的模板库与 etl::queue
https:/www.etlcpp.comqueue.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));
因为元素已经是一个r值
然而, queue.push(element);
调用元素复制构造函数(已被删除),我怎样才能调用元素移动构造函数呢?
你必须使用 std::move
转换 element
到rvalue。作为一个命名变量 element
本身是一个l值,甚至它的类型是一个r值引用。
queue.push(std::move(element));
请注意,类型和 价值类别 是两件独立的事情。
(强调是我的)
每个C++表达式(一个操作符及其操作数、一个文字、一个变量名等)的特征是 两个独立的属性:a 类型 和a 价值类别.
...
下面的表达式是l值表达式。
- 变量名,函数名
, a template parameter object (since C++20)
或一个数据成员,无论类型如何,如std::cin
或std::endl
. 即使变量的类型是rvalue引用,由其名称组成的表达式也是lvalue表达式。;