C++ - 调用 setter 的函数 - 如何修饰参数?

C++ - Functions calling setters - how to decorate the arguments?

据我了解,当前 (post-C++11) 约定是使用可移动类型编写 setters 如下:

void set_a(A a) {
    a_ = std::move(a);
}

编写另一个 setter 或调用此 set_a() 的转发器函数的最佳方法是什么?例如:

void set_ab(A a, B b) {
    set_a(std::move(a));  // like this?
    set_b(b);  // or like this?
}

或者:

void do_one(A a) {  // by value? by const ref? by rvalue-ref?
    do_two(a);  // move?
}
void do_two(A a) {
   obj.set_a(a);
}

我认为 std::move() 在这里不合适,那么我应该如何编写它以提高效率,假设一个优化编译器?

是否所有这些函数签名都取决于我是否将最终的 A 对象存储在某处?

谢谢

当你有一个你不打算重用的值时,std::move它。

当你有一个右值引用时,你不会重用它,std::move它。

当转发引用时,std::forward 当且仅当它是右值引用时您才移动它。

按值取值的规则假定:

  1. 你不介意在调用站点默默复制一份

  2. 搬家这么便宜,你把它当成免费的了

  3. 复制比移动贵很多

如果 (1) 为假,则改为在接收器参数中采用右值引用 (A&&)。现在调用者必须明确地制作他们的副本。

如果 (2) 为假,则应使用完美转发、多重重载、类型擦除嵌入或无数其他更复杂的解决方案。

如果 (3) 为假,请不要理会 moveing。按值取值。

如果所有 3 个都为真,那么您的 set_ab 看起来像:

void set_ab(A a, B b) {
  set_a(std::move(a));
  set_b(std::move(b));
}