我目前正在阅读有关移动构造函数的信息。我写了以下代码
#include <iostream>
#include <cstring>
class foo
{
private:
std::string str_member;
char* char_member ;
public:
foo()
{
std::cout << "Regular constructor \n";
}
foo(const foo& r)
{
std::cout << "Copy Constructor \n";
//Make copies of the contents
char_member = new char[strlen(r.char_member)+1];
strcpy(char_member,r.char_member);
str_member = r.str_member;
}
foo& operator=(const foo& r)
{
//Do somestuff
std::cout << "Copy Assignment operator \n";
}
//Move Special Member functions
//Move constructor
foo(foo&& r)
{
//Do somestuff
std::cout << "move constructor \n";
}
//Move Assigment operator
foo& operator=(foo&& r)
{
//Do some stuff
std::cout << "Move assignment operator";
}
};
//Some Method that returns an object by value
foo Mymethod()
{
foo d;
return d;
}
int main()
{
foo p(Mymethod());
std::cin.get();
}
输出是&#34;常规构造函数&#34;。
现在上面的类只是一个测试类,并没有真正具有正确的复制/赋值/移动构造函数或移动赋值。我目前只对了解何时调用移动构造函数感兴趣。根据我的理解,当函数返回时,应该调用move构造函数,然后返回rvalue,然后调用另一个移动构造函数。
我看过When Does Move Constructor get called?和aschepler声明:
调用移动构造函数:
- [..]
- 在抛出函数本地类对象时,编译器没有完全消除复制/移动
为什么我只获得常规构造函数。如果有人能向我解释为什么我的理解是错误的,我将不胜感激。我相信当从方法返回对象时应该调用移动构造函数,然后应该调用foo p
的移动构造函数。