C++ LValue 和 Rvalue 的参考,无需类型推断

C++ reference for both LValue and Rvalue without type deduction

本文关键字:类型 参考 LValue Rvalue C++      更新时间:2023-10-16

我正在阅读一个关于左值/右值引用的好教程。如果我正确理解了何时存在类型推导,那么像T&&可以同时接受左值和右值。

但是有没有办法在没有泛型类的情况下实现这一目标?我想避免重复我接受左值和右值的所有方法。当然,避免按值传递大型对象。

r 值

引用主要用于移动构造函数和移动赋值。

对于常规方法,您可以只坚持使用一种引用类型:

  • 对于只读参数(不带副本),常量引用就足够了。

  • 如果你必须做一个副本,你可以按值获取你的参数并使用std::move

例:

class Test
{
public:
    void displayString(const std::string& s) const { std::cout << s << m_s; }
    void setString(std::string s) { m_s = std::move(s); }
private:
    std::string m_s;
};

如果您实现的函数不需要 rvalue 语义,那么您可以简单地通过引用或常量引用传递参数。

但是,如果可以利用右值并且不想复制代码,则可以按值传递并移动结果。这应该几乎与代码复制或具有通用引用的实现一样有效,并且更易于维护。

这个答案显示了技术:C++11 中的所有/大多数 setter 函数是否应该编写为接受通用引用的函数模板?

// copy, then move
void set_a(A a_) { a = std::move(a_); }