【问题标题】:c++ How to pass an rvalue Reference to another functionc ++如何将右值引用传递给另一个函数
【发布时间】:2020-05-06 11:15:41
【问题描述】:

我正在使用带有 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));,因为元素已经是一个右值引用

但是,queue.push(element); 调用元素复制构造函数(已删除) 我怎样才能调用元素移动构造函数?

【问题讨论】:

  • 命名变量永远不是右值引用。该参数表明它在调用时将绑定到右值引用。但是您需要通过调用 std::move() 将命名值转换为 r 值引用

标签: c++ c++11 move-semantics move-constructor


【解决方案1】:

您必须使用std::moveelement 转换为右值。作为命名变量element本身是一个左值,甚至它的类型也是一个右值引用。

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

注意类型和value categories是两个独立的东西。

(强调我的)

每个 C++ 表达式(带有操作数、文字、变量名等的运算符)都具有 两个独立的属性:类型值类别

...

以下表达式是左值表达式:

  • 变量、函数, a template parameter object (since C++20)或数据成员的名称,与类型无关,例如std::cinstd::endl即使变量的类型是右值引用, 由其名称组成的表达式是左值表达式;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多