【发布时间】:2022-01-25 00:15:11
【问题描述】:
A 有几个关于复制省略和移动的问题。 假设我有以下代码:
class A {};
class B {
public:
A get1() const {
A local_var;
return local_var;
}
A get1bad() const {
A local_var;
return std::move(local_var);
}
A get2() const {
return member_var;
}
A get3() const {
return std::move(member_var);
}
private:
A member_var;
};
我读过很多人说不要在返回时继续前进。 据我所知,这是因为使用复制省略,在案例 get1 上,编译器不会调用构造函数 + 移动构造函数,而只会调用默认构造函数,而案例 get1bad 会强制编译器调用构造函数 + 移动。
我的问题是关于变量不是本地的情况(get2 vs get3)。 在这种情况下,无论如何都会在类中构造变量。在 get2 中,我认为实际上没有任何优化是可能的。在这种情况下,如果我并不真正关心确保 B 类具有有效的 A 对象,那么实际移动不是更好吗?不就是调用通常比拷贝构造函数便宜的移动构造函数吗?
【问题讨论】:
-
是的,对于非本地对象,最好通过移动返回,但在您的情况下,成员函数
get3是const所以数据成员member_var也将被复制到这里.当你犯了这样的错误时,像 clang-tidy 这样的工具会让你知道。