3 回答
TA贡献1828条经验 获得超4个赞
在几乎所有情况下,您的语义都应该是:
bar(foo f); // want to obtain a copy of f
bar(const foo& f); // want to read f
bar(foo& f); // want to modify f
所有其他签名应该只是谨慎使用,并且有充分的理由。编译器现在几乎总是以最有效的方式解决这些问题。您可以继续编写代码!
TA贡献1779条经验 获得超6个赞
如果在函数体内部需要对象的副本或者只需要移动对象,则按值传递参数。const&如果您只需要对对象进行非变异访问,则传递。
对象复制示例:
void copy_antipattern(T const& t) { // (Don't do this.)
auto copy = t;
t.some_mutating_function();
}
void copy_pattern(T t) { // (Do this instead.)
t.some_mutating_function();
}
对象移动示例:
std::vector<T> v;
void move_antipattern(T const& t) {
v.push_back(t);
}
void move_pattern(T t) {
v.push_back(std::move(t));
}
非变异访问示例:
void read_pattern(T const& t) {
t.some_const_function();
}
- 3 回答
- 0 关注
- 530 浏览
添加回答
举报