c++ 如何将一个r值引用传递给另一个函数。

问题描述 投票:0回答:1

我使用的是内嵌的模板库与 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); 调用元素复制构造函数(已被删除),我怎样才能调用元素移动构造函数呢?

c++ move move-constructor
1个回答
5
投票

你必须使用 std::move 转换 element 到rvalue。作为一个命名变量 element 本身是一个l值,甚至它的类型是一个r值引用。

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

请注意,类型和 价值类别 是两件独立的事情。

(强调是我的)

每个C++表达式(一个操作符及其操作数、一个文字、一个变量名等)的特征是 两个独立的属性:a 类型 和a 价值类别.

...

下面的表达式是l值表达式。

  • 变量名,函数名, a template parameter object (since C++20)或一个数据成员,无论类型如何,如 std::cinstd::endl. 即使变量的类型是rvalue引用,由其名称组成的表达式也是lvalue表达式。;
© www.soinside.com 2019 - 2024. All rights reserved.