https://zhuanlan.zhihu.com/p/654113232
大多数时候没有意义,但有的时候会有意义。
没意义的
#include<iostream>struct X{X() { puts("X()"); }X(const X&) { puts("X(const X&)"); }X(X&&)noexcept { puts("X(X&&)"); }~X() { puts("~X()"); }
};X f(){X x;return std::move(x);
}int main(){X x = f();
}
有意义的
#include<iostream>struct X{X() { puts("X()"); }X(const X&) { puts("X(const X&)"); }X(X&&)noexcept { puts("X(X&&)"); }~X() { puts("~X()"); }
};struct Test{X x;X f(){return std::move(x);//数据成员不是隐式可移动实体,如果不std::move,直接return x,重载决议不会选择移动构造。}X f2() {return x;}
};int main(){Test t;puts("---------");t.f();puts("---------");t.f2();puts("---------");
}
我觉得应该稍微描述一下数据成员不是隐式可移动实体,如果不 std::move
,而是直接 return x
,重载决议不会选择移动构造。
或者至少需要稍微提一下
总结
#include <iostream>
#include <format>
struct A{std::string str;A() = default;A(std::string&& str):str{std::move(str)}{puts("move");}A(const std::string& str):str{str}{puts("copy");}~A(){puts("~A()");}
};
A foo(){std::string str = "Hello world......................................";std::cout << std::format("{}: {}\n", (void*)str.c_str(), str.c_str());return str;
}
int main() {A a = foo();puts("====");std::cout << std::format("{}: {}\n", (void*)a.str.c_str(), a.str.c_str());
}