C++ 采用右值参数的函数

C++ 采用右值参数的函数,c++,c++11,C++,C++11,在我的公司里,我见过很多函数采用右值参数的代码 例如: void Notifier::PostEvent(std::unique_ptr<IEvent>&& event) { std::unique_lock<std::mutex> lock(m_Mutex); m_events.push_back(std::move(event)); m_conditionVariable.notify_all(); } void通知程序::P

在我的公司里,我见过很多函数采用右值参数的代码

例如:

void Notifier::PostEvent(std::unique_ptr<IEvent>&& event)
{
    std::unique_lock<std::mutex> lock(m_Mutex);
    m_events.push_back(std::move(event));
    m_conditionVariable.notify_all();
}
void通知程序::PostEvent(std::unique\u ptr&&event)
{
std::唯一的_锁(m_互斥);
m_events.push_back(std::move(event));
m_conditionVariable.notify_all();
}
这里没有模板。这很容易写成这样:

void Notifier::PostEvent(std::unique_ptr<IEvent> event)
{
    std::unique_lock<std::mutex> lock(m_Mutex);
    m_events.push_back(std::move(event));
    m_conditionVariable.notify_all();
}
void通知程序::PostEvent(std::unique_ptr事件)
{
std::唯一的_锁(m_互斥);
m_events.push_back(std::move(event));
m_conditionVariable.notify_all();
}

由于参数“event”在两种情况下都是一个sink值,因此它们实际上是相同的。我认为第一个版本的唯一优点是它为唯一的\u ptr节省了一个移动构造函数。对吗?真的值得吗?

好的。现在我读了以后明白多了

在我的第一个例子中,通过右值引用传递,它或多或少类似于通过非常量左值引用传递。尽管在函数调用后,您可能希望参数为空,但这并不能保证。这完全取决于函数对它的实际作用。通过像我在这里所做的那样将其推入/移动到一个向量中,unique_ptr将为空。但是,如果我不做任何移动(比如我只调用IEEvent类的一个方法),那么unique_ptr就不是空的

因此,unique_ptr rvalue reference参数实际上不能保证调用后该值会发生什么变化,即它是否为接收器。呼叫后它可能是空的,也可能不是空的。只有通过检查代码,才能确定将发生什么

我认为回顾一下,第二个函数定义,它采用了一个唯一的值。这将确保唯一的ptr已被移动,并且以后不应再使用。

的可能副本的可能副本