move构造函数只影响class的指针成员指向的内存space吗?
Does move constructor only affect the memory space pointed to by the pointer member of the class?
例如,这段代码:
struct President
{
std::string name;
std::string country;
int year;
President(std::string p_name, std::string p_country, int p_year)
: name(std::move(p_name)), country(std::move(p_country)), year(p_year)
{
std::cout << "--constructed\n";
}
/*
President(const President& other)
: name(std::move(other.name)), country(std::move(other.country)), year(other.year)
*/
President(const President& other)
: name(other.name), country(other.country), year(other.year)
{
std::cout << "--copy constructed\n";
}
President(President&& other)
: name(std::move(other.name)), country(std::move(other.country)), year(other.year)
{
std::cout << "--moved\n";
}
~President()
{
cout << "\n"<< &name << " " << country << endl;
std::cout << "--destruct\n";
}
President& operator=(const President& other);
};
无论是移动构造函数还是拷贝构造函数,它们都会导致三个数据成员的值存储在新内存中,旧内存会被释放。
我的意思对吗?
And my meaning is right?
抱歉,没有。您的移动构造函数将按照您的描述工作,因为它将 'steal' 来自 other
的 name
和 country
成员变量的内容,但复制构造函数不会。 std::move
对 const
对象没有任何作用,您应该将其从复制构造函数中删除。毕竟,操作词是 copy
,对吧?
值得注意的是,您根本不需要在此处编写自己的副本或移动构造函数 ('rule of zero')。编译器合成的默认构造函数可以正常工作。哦,std::move
在诸如 int
的基本类型上也什么都不做——无论你是否包含变量,它都会被复制。
例如,这段代码:
struct President
{
std::string name;
std::string country;
int year;
President(std::string p_name, std::string p_country, int p_year)
: name(std::move(p_name)), country(std::move(p_country)), year(p_year)
{
std::cout << "--constructed\n";
}
/*
President(const President& other)
: name(std::move(other.name)), country(std::move(other.country)), year(other.year)
*/
President(const President& other)
: name(other.name), country(other.country), year(other.year)
{
std::cout << "--copy constructed\n";
}
President(President&& other)
: name(std::move(other.name)), country(std::move(other.country)), year(other.year)
{
std::cout << "--moved\n";
}
~President()
{
cout << "\n"<< &name << " " << country << endl;
std::cout << "--destruct\n";
}
President& operator=(const President& other);
};
无论是移动构造函数还是拷贝构造函数,它们都会导致三个数据成员的值存储在新内存中,旧内存会被释放。
我的意思对吗?
And my meaning is right?
抱歉,没有。您的移动构造函数将按照您的描述工作,因为它将 'steal' 来自 other
的 name
和 country
成员变量的内容,但复制构造函数不会。 std::move
对 const
对象没有任何作用,您应该将其从复制构造函数中删除。毕竟,操作词是 copy
,对吧?
值得注意的是,您根本不需要在此处编写自己的副本或移动构造函数 ('rule of zero')。编译器合成的默认构造函数可以正常工作。哦,std::move
在诸如 int
的基本类型上也什么都不做——无论你是否包含变量,它都会被复制。