【问题标题】:Functions taking rvalue parameters采用右值参数的函数
【发布时间】:2019-11-04 23:37:48
【问题描述】:

我在公司中看到过很多代码,其中函数采用右值参数。

例子:

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 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();
}

由于参数 'event' 在这两种情况下都是接收器值,因此它们实际上是相同的。我认为第一个版本的唯一优点是它为 unique_ptr 保存了一个移动构造函数。那是对的吗?真的值得吗?

【问题讨论】:

标签: c++ c++11


【解决方案1】:

好的。现在我读了How do I pass a unique_ptr argument to a constructor or a function?后理解得更好了

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

因此,unique_ptr 右值引用参数实际上并不保证调用后值会发生什么,即它是否是接收器。通话后它可能是空的,也可能不是。只有检查代码才能确定会发生什么。

回想起来,我认为第二个函数定义中使用 unique_ptr 的值更好。这样可以确保 unique_ptr 已被移动,以后不应再使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2014-07-11
    • 2012-07-19
    • 1970-01-01
    • 2011-05-06
    • 2013-07-12
    相关资源
    最近更新 更多