C++代码执行时move构造函数未被调用原因咨询
输出原因解释
第一行param called的原因
你调用mystring s1 = move("Hello World");时,"Hello World"本身是const char*类型的字符串字面值,std::move仅会将它转换为const char*类型的右值,不会自动生成mystring类型的对象。
你的移动构造函数要求的入参是mystring&&类型,和const char*完全不匹配,因此编译器会优先匹配可以接收const char*入参的构造函数,也就是你写的mystring(const char * obj),因此输出param called。
第二行copy called的原因
执行mystring s2 = s1;时,s1是已经构造完成的mystring类型左值,而移动构造函数的入参是mystring&&右值引用,左值无法直接绑定到右值引用,因此编译器会匹配入参为mystring&的拷贝构造函数,输出copy called。
补充说明
如果希望触发移动构造,需要先构造出mystring类型的临时对象再调用std::move,示例写法:
mystring s1 = std::move(mystring("Hello World"));
此时右侧是mystring类型的右值,会匹配移动构造函数输出shallow copy created。
另外建议你将拷贝构造函数的入参改为const mystring& obj,否则无法对const修饰的mystring对象执行拷贝操作,不符合C++类的常规实现规范。
内容的提问来源于stack exchange,提问作者hacker_panda
相关产品推荐
相关产品推荐

