猿问

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

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

在传统的C ++中,将值传递给函数和方法对于大型对象来说是很慢的,并且通常不赞成。相反,C ++程序员倾向于传递引用,这更快,但它引入了围绕所有权的各种复杂问题,特别是围绕内存管理(如果对象是堆分配的)

现在,在C ++ 11中,我们有Rvalue引用和移动构造函数,这意味着可以实现一个大的对象(比如一个std::vector),它可以通过值传入和传出函数。

那么,这是否意味着默认值应该是传递类型实例的值,例如std::vectorstd::string?自定义对象怎么样?什么是新的最佳做法?


弑天下
浏览 531回答 3
3回答

明月笑刀无情

在几乎所有情况下,您的语义都应该是:bar(foo f); // want to obtain a copy of fbar(const foo& f); // want to read fbar(foo& f); // want to modify f所有其他签名应该只是谨慎使用,并且有充分的理由。编译器现在几乎总是以最有效的方式解决这些问题。您可以继续编写代码!

哆啦的时光机

如果在函数体内部需要对象的副本或者只需要移动对象,则按值传递参数。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();}
随时随地看视频慕课网APP
我要回答