c++11 : given f(const X&) and f(X&&), 我们需要 f(X&) 吗?

标签 c++ pass-by-reference move-semantics

标题说明了一切。

第一种情况 f(const X&) 是老式的 const 引用参数。

但是,当取一个可变引用参数时,为什么不总是使用X&&呢?这样,客户端代码可以使用临时值或常规左值,而不是 f() 指示用法。

编辑:我的草率,抱歉。我的意思是,给定 fc(const X&) 和 fm(X&&),我们是否需要 fm(X&)?

编辑:示例:我使用无状态装饰器作为参数传递:

class Base64Writer: public Writer {
public:
  Base64Writer(Writer& w): w_(w) {}
private:
  virtual void doWrite() override;
  Writer& w_;
}

void func(Writer&& w) { w.doWrite(); }

// to be called as
Writer wr = ...;
func(Base64Writer(wr));

最佳答案

  • 如果您想问:同时拥有所有三个重载是否合乎逻辑?

    在大多数情况下,这不是一个好主意。因为重载函数的语义相互矛盾。一个 promise 它不会修改参数,另一个不做任何这样的 promise (它默认说它会修改参数!)。仅 const 不同的此类重载函数的用户将感到困惑。

    同时有这些重载是有意义的:

    void process(std::vector<int> const&);
    void process(std::vector<int> &&);
    

    但是除了上面两个之外的第三个对我来说意义不大:

    void process(std::vector<int> &); //contradicts the first overload
    

    它只会增加困惑并使代码更难阅读。如果你想要这种语义,请为函数选择一个不同的名称!

  • 如果您想问:您应该拥有哪一个(尽管不一定同时拥有)?

    我会说,这取决于语义。如果参数充当输入和/或输出参数,则 f(X&) 有意义。如果参数只是输入参数,那么f(X const&)是有意义的,在这种情况下你还可以另外定义f(X&&) ,以获得性能优势!

关于c++11 : given f(const X&) and f(X&&), 我们需要 f(X&) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14412839/

相关文章:

arrays - 结构体数组成员地址问题

c - Valgrind C : Accessing by reference and unitialized value

C++ 迭代器 "remove-proof"

c++ - 检测 32 位双字 + 双字进位/C++

c++ - 为什么我们在 C++ 中需要接口(interface)或纯虚函数

c++ - 当 T = int& 时,为什么构造函数 Message(const T& data) 与 Message(T&& data) 冲突?

c++ - 为什么有些人使用交换进行 move 分配?

c++ - 通过引用 std::inner_product 传递迭代器

c++ - 带有 *& 参数的函数中的 Const 关键字。

C++:在基对象列表中,派生内存在通过引用传递时会产生意想不到的结果