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) 为假,则改为在接收器参数中采用右值引用 (A&&
)。现在调用者必须明确地制作他们的副本。
如果 (2) 为假,则应使用完美转发、多重重载、类型擦除嵌入或无数其他更复杂的解决方案。
如果 (3) 为假,请不要理会 move
ing。按值取值。
如果所有 3 个都为真,那么您的 set_ab
看起来像:
void set_ab(A a, B b) {
set_a(std::move(a));
set_b(std::move(b));
}
据我了解,当前 (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) 为假,则改为在接收器参数中采用右值引用 (A&&
)。现在调用者必须明确地制作他们的副本。
如果 (2) 为假,则应使用完美转发、多重重载、类型擦除嵌入或无数其他更复杂的解决方案。
如果 (3) 为假,请不要理会 move
ing。按值取值。
如果所有 3 个都为真,那么您的 set_ab
看起来像:
void set_ab(A a, B b) {
set_a(std::move(a));
set_b(std::move(b));
}