【发布时间】:2021-08-09 13:35:57
【问题描述】:
#include <iostream>
using namespace std;
class Test {
public:
Test(string value){
cout<<"Ctor "<<value<<endl;
_val=value;
}
Test( Test&& mv): _val(mv._val)
{
mv._val=string();
cout<<"Mv constructor"<<endl;
}
string& get()
{
return this->_val;
}
private:
string _val;
};
void print(Test&& t)
{
cout<<"Stampa val is "<<t.get()<<endl;
}
int main()
{
Test a{"ciao"};
print(move(a));
cout<<"Val of a is "<<a.get()<<endl;
print(Test("test"));
return 0;
}
这个输出是(将行号添加到标准输出):
曹操
Stampa val is ciao
val 是 ciao
托儿测试
Stampa val 是测试
为什么在 main 的第 2 行没有调用 mv 语义?我可能会在第四行理解有一个优化,所以只调用了构造函数,但是我无法解释第一步。有什么想法吗?
【问题讨论】:
-
std::move()只转换为右值,实际上并没有做任何事情。 -
因为调用
print时不需要复制/移动Test实例。print采用 Rvalue 引用,并且您通过move传递 Rvalue 引用转换a。顺便说一句,修复你的移动 ctor:_val(std::move(mv._val)). -
Move构造函数是一个构造函数,也就是说它构造了一个新的对象。在
print(move(a));语句中,根本没有涉及新对象,因此没有调用构造函数。
标签: c++ move-semantics stdmove