C++移动语义不执行移动
其思想是使用移动语义来避免不必要的复制。 鉴于以下代码:C++移动语义不执行移动,c++,c++11,move-semantics,C++,C++11,Move Semantics,其思想是使用移动语义来避免不必要的复制。 鉴于以下代码: #include <iostream> #include <string> #include <utility> class Address { private: const std::string m_street; const std::string m_city; const int m_suite; public: Address(const std::s
#include <iostream>
#include <string>
#include <utility>
class Address {
private:
const std::string m_street;
const std::string m_city;
const int m_suite;
public:
Address(const std::string &street, const std::string &city, int suite) : m_street {std::move(street)},
m_city {std::move(city)},
m_suite {suite}
{
}
friend std::ostream& operator<<(std::ostream &out, const Address &address)
{
out << "Address: (street: " << address.m_street << ", city: " << address.m_city << ", suite: " << address.m_suite << ")\n";
return out;
}
Address(const Address &other) = delete;
Address& operator=(const Address &other) = delete;
Address(Address &&other) : m_street {std::move(other.m_street)},
m_city {std::move(other.m_city)},
m_suite {std::move(other.m_suite)}
{
}
};
class Contact {
const std::string m_name;
const Address m_address;
public:
Contact(const std::string &name, Address &address) : m_name {std::move(name)},
m_address {std::move(address)}
{
}
friend std::ostream& operator<<(std::ostream& out, const Contact &contact)
{
out << "Contact: " << contact.m_name << "\n" << contact.m_address << "\n";
return out;
}
};
int main()
{
Address address1 {"123 East Dr", "London", 123};
Contact john {"John Doe", address1};
std::cout << john;
std::cout << address1;
return 0;
}
为什么address1变量的内容没有移动?打印出来的不是应该是吗
Address: (street: , city: , suite: <whatever>)
另外,为什么对一篇主要是代码的文章有限制?代码中给出了所有内容。我对移动语义感兴趣,所以我创建了address1变量,该变量将保存一些地址。我使用相同的变量使用移动语义初始化Contact类型的对象,但是没有执行移动语义,address1变量仍然保持相同的值。数据成员m_street和m_city被声明为const;然后,在地址为m_street{std::moveother.m_street}的move构造函数的成员初始值设定项列表中,使用std::string的copy构造函数而不是move构造函数
您可能需要删除const限定符,然后
Contact: John Doe
Address: (street: 123 East Dr, city: London, suite: 123)
Address: (street: , city: , suite: 123)
顺便说一句:对于int这样的内置类型,move的效果与copy相同。这就是为什么套房的价值仍然是123
BTW2:对于的移动构造函数
移动构造函数。使用移动语义构造包含其他对象内容的字符串。另一个处于有效但未指定的状态
移动操作后,移动的对象不保证被修改为空。数据成员m_street和m_city被声明为const;然后,在地址为m_street{std::moveother.m_street}的move构造函数的成员初始值设定项列表中,使用std::string的copy构造函数而不是move构造函数
您可能需要删除const限定符,然后
Contact: John Doe
Address: (street: 123 East Dr, city: London, suite: 123)
Address: (street: , city: , suite: 123)
顺便说一句:对于int这样的内置类型,move的效果与copy相同。这就是为什么套房的价值仍然是123
BTW2:对于的移动构造函数
移动构造函数。使用移动语义构造包含其他对象内容的字符串。另一个处于有效但未指定的状态
移动操作后,移动的对象不能保证修改为空。为什么address1变量的内容没有移动?为什么会这样?它不是一个右值。但它作为一个引用传递给Contact构造函数,然后执行move以使其成为右值?最好使用Contactconst std::string&name、Address&Address。为什么address1变量的内容没有移动?为什么会这样?它不是一个右值。但它作为一个引用传递给Contact构造函数,然后执行move以使其成为右值?最好使用Contactconst std::string&name、Address&Address。也许值得一提的是,一般来说,moved from对象可以处于任何状态,不被修改并不常见,但也不一定wrong@idclev463035818补充。std::string也是如此。也许值得一提的是,一般来说,moved from对象可以处于任何状态,不被修改并不常见,但也不一定wrong@idclev463035818补充。std::string也是如此。