标题说明了一切。
第一种情况 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/