最佳答案
因为我们在 C + + 中有 move 语义,所以现在通常要做
void set_a(A a) { _a = std::move(a); }
其原因是,如果 a
是一个右值,那么副本将被省略,并且只有一次移动。
但是如果 a
是左值会发生什么呢?似乎会有一个拷贝构造,然后是一个移动赋值(假设 A 有一个合适的移动赋值操作符)。如果对象具有太多的成员变量,则移动分配的开销可能很大。
另一方面,如果我们这么做了
void set_a(const A& a) { _a = a; }
只有一份作业。如果要传递 lvalue,我们是否可以说这种方式优于按值传递习惯用法?