为了账号安全,请及时绑定邮箱和手机立即绑定

在C ++ 11中,pass-by-value是一个合理的默认值吗?

在C ++ 11中,pass-by-value是一个合理的默认值吗?

C++
弑天下 2019-08-06 14:29:48
在C ++ 11中,pass-by-value是一个合理的默认值吗?在传统的C ++中,将值传递给函数和方法对于大型对象来说是很慢的,并且通常不赞成。相反,C ++程序员倾向于传递引用,这更快,但它引入了围绕所有权的各种复杂问题,特别是围绕内存管理(如果对象是堆分配的)现在,在C ++ 11中,我们有Rvalue引用和移动构造函数,这意味着可以实现一个大的对象(比如一个std::vector),它可以通过值传入和传出函数。那么,这是否意味着默认值应该是传递类型实例的值,例如std::vector和std::string?自定义对象怎么样?什么是新的最佳做法?
查看完整描述

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

所有其他签名应该只是谨慎使用,并且有充分的理由。编译器现在几乎总是以最有效的方式解决这些问题。您可以继续编写代码!


查看完整回答
反对 回复 2019-08-06
?
哆啦的时光机

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();

}


查看完整回答
反对 回复 2019-08-06
  • 3 回答
  • 0 关注
  • 530 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信