验证C++移动语义理解:传值参数两次用std::move是否正确?
C++移动语义示例的正确性判断
#include <string> #include <utility> class MyClass { public: void Set(std::string str) { myString = std::move(str); } private: std::string myString; }; int main() { std::string largeString = "A very long piece of text..."; // 此场景下largeString会被复制一次,因为是按值传递(是否正确?) MyClass myClass; myClass.Set(largeString); // 此场景下largeString不会被复制,因为被移动了两次(是否正确?) MyClass myClass2; myClass.Set(std::move(largeString)); // 执行此语句后,main()中不能再使用largeString return 0; }
注释正误分析
- 第一个注释完全正确:按值传递参数时,会从
largeString复制构造出函数参数str,这是整个过程中唯一的一次复制操作;后续myString = std::move(str)是移动赋值,不会产生新的字符串副本。 - 第二个注释部分正确,部分存在错误:
- 「largeString不会被复制」的表述正确:
std::move(largeString)将左值转换为右值引用,参数str会通过移动构造从largeString初始化,而非复制;后续myString = std::move(str)也是移动赋值,全程没有复制操作。 - 「被移动了两次」的表述错误:
largeString仅被移动一次(用于构造函数参数str),之后是str被移动赋值给myString,并非largeString被移动两次。 - 「执行此语句后,main()中不能再使用largeString」的表述正确:移动操作完成后,
largeString处于有效但未定义的状态,C++标准不保证它仍持有原有值或能正常使用,除非对其重新赋值。
- 「largeString不会被复制」的表述正确:
内容的提问来源于stack exchange,提问作者FantaBlack28
相关产品推荐
相关产品推荐

