c ++如何将右值引用传递给另一个函数
c++ How to pass an rvalue Reference to another function
我在 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
将 element
转换为右值。由于命名变量 element
本身是一个左值,即使它的类型也是一个右值引用。
queue.push(std::move(element));
注意类型和value categories是两个独立的东西。
(强调我的)
Each C++ expression (an operator with its operands, a literal, a variable name, etc.) is characterized by two independent properties: a type and a value category.
...
The following expressions are lvalue expressions:
- the name of a variable, a function
, a template parameter object (since C++20)
, or a data member, regardless of type, such as std::cin
or std::endl
. Even if the variable's type is rvalue reference, the
expression consisting of its name is an lvalue expression;
我在 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
将 element
转换为右值。由于命名变量 element
本身是一个左值,即使它的类型也是一个右值引用。
queue.push(std::move(element));
注意类型和value categories是两个独立的东西。
(强调我的)
Each C++ expression (an operator with its operands, a literal, a variable name, etc.) is characterized by two independent properties: a type and a value category.
...
The following expressions are lvalue expressions:
- the name of a variable, a function
, a template parameter object (since C++20)
, or a data member, regardless of type, such asstd::cin
orstd::endl
. Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression;