【问题标题】:Right values as function argument, correct usage?作为函数参数的正确值,正确用法?
【发布时间】:2020-12-13 22:49:34
【问题描述】:

尝试更多地使用 rightvalues 但我很困惑,我应该如何设计我想要使用正确值的函数:

// Pass by whatever-it's-called
void RockyBalboa::DoSomething(std::string&& str){ 
     m_fighters.push_back(str);
}
// Pass by reference
void RockyBalboa::DoSomething(std::string& str){
     m_fighters.push_back(std::move(str)); 
}

这两个函数调用之间的实际区别是什么?当我用双&符号传递它时会发生什么使用std::move

【问题讨论】:

  • 反过来,&& 应该被移动。

标签: c++ parameter-passing rvalue-reference stdmove


【解决方案1】:

你已经交换了用法。这是可以移动的Rvalue 引用。 Lvalue 参考应为const

// Rvalue reference
void RockyBalboa::DoSomething(std::string&& str){ 
     m_fighters.push_back(std::move(str));
}
// Lvalue reference
void RockyBalboa::DoSomething(const std::string& str){ // note: const
     m_fighters.push_back(str);
}

但是,您可以使用 forwarding reference 来涵盖这两种情况:

#include <type_traits>

// Forwarding reference
template<typename T>
void RockyBalboa::DoSomething(T&& str) {
    // Create a nice error message at compile time if the wrong type (T) is used:
    static_assert(std::is_convertible_v<T, std::string>);

    m_fighters.emplace_back(std::forward<T>(str));
}

【讨论】:

  • 太棒了,我实际上也需要转发,因为我有一个包装函数,可以执行类似于 wrapper(std::string&amp;&amp; str) { return g(std::string str) } 的操作,我现在将其更改为 return g(std::forward&lt;std::string&gt;(str))
  • @dejoma 很高兴它有帮助!请仔细阅读有关转发引用的链接 - 特别是说:“转发引用是:1)函数模板的函数参数声明为对同一函数模板的 cv 非限定类型模板参数的右值引用。 2) auto&amp;&amp; 除非从大括号括起来的初始化列表推导出来:".
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2020-12-17
  • 1970-01-01
  • 2014-08-15
相关资源
最近更新 更多