【发布时间】:2015-11-24 10:20:06
【问题描述】:
将对象传递给函数时,可以选择通过值或const& 传递参数。特别是当对象的创建成本可能很高并且它在内部发生变异或用于初始化另一个对象时,建议按值传递对象。例如:
class Foo {
std::vector<std::string> d_strings;
public:
Foo(std::vector<std::string> strings): d_strings(std::move(strings)) {}
// ...
};
常规方法是将strings 参数声明为std::vector<std::string> const& 并复制该参数。上面构造函数的value参数也需要复制!
为什么最好按值传递而不是通过const& 传递?
【问题讨论】:
-
按值传递是“推荐”,这可能有点大胆。我想说这绝对是叶代码的好建议,因为它易于教授,避免了复杂性,并且用户不需要拼写像
&&这样的尴尬标点符号。然而,在通用库代码中,似乎更合适的是有两个重载(const string&和string&&),以免强制复制/移动(可能很便宜)。 -
@KerrekSB:创建一个函数通常比创建两个函数更不容易出错。我确实同意高质量的实现可能希望创建两个重载,尽管
const&版本实际上只是在实际需要完成复制时避免了移动。 -
另一个重要的决定因素是你是否知道具体的参数类型,或者你是否有通用代码。在前一种情况下,您可以对额外移动的成本更有信心。对我来说,区别不在于 QoI,而在于代码的通用性和重用水平。我对我的用户了解得越少,我就越不想限制他们。
-
move并不便宜:移动std::array<T, 1024>无论如何都会复制,所以通过 const 引用传递它。