在 std::list 的元素 std::move 之后得到无效输出
getting invalid ouput after std::move of an element from std::list
我正在尝试了解 std::move。在我的代码中,我从 std::list<struct Data>
移动一个元素,其中 struct Data
内部包含两个 std::string
字段,但我没有得到预期的输出。这是我的代码:
#include <iostream>
#include <string>
#include <list>
struct Data {
std::string topic {};
std::string msg {};
Data(const std::string& topic, const std::string& msg) {
this->topic = topic;
this->msg = msg;
}
};
int main() {
std::list<Data> data_list;
data_list.push_back(Data("A", std::string(1000, 'a')));
data_list.push_back(Data("B", std::string(1000, 'b')));
data_list.push_back(Data("C", std::string(1000, 'c')));
data_list.push_back(Data("D", std::string(1000, 'd')));
data_list.push_back(Data("E", std::string(1000, 'e')));
while (!data_list.empty()) {
std::cout << (void*)&data_list.front() << "\n";
Data&& d1 = std::move(data_list.front());
data_list.pop_front();
std::cout << d1.topic << ", " << d1.msg << "\n";
std::cout << (void*)&d1 << "\n\n";
}
std::cout << std::endl;
}
这里的问题是你实际上并没有移动任何东西。当您调用 std::move
时,实际上并没有移动任何东西。它所做的是将您拥有的左值转换为右值,这样它就可以被移动构造或移动分配。那不是你在这里做的。你用
Data&& d1 = std::move(data_list.front());
其中有 d1
作为右值引用,意味着不再移动,它只是对列表中对象的引用。当您弹出该元素时,您的引用现在指的是一个不再存在的对象,并且使用它具有导致您看到的输出的未定义行为。如果要移动元素,需要
Data d1 = std::move(data_list.front());
现在 d1
将使用 Data
的隐式移动构造函数将列表元素移动到 d1
.
我正在尝试了解 std::move。在我的代码中,我从 std::list<struct Data>
移动一个元素,其中 struct Data
内部包含两个 std::string
字段,但我没有得到预期的输出。这是我的代码:
#include <iostream>
#include <string>
#include <list>
struct Data {
std::string topic {};
std::string msg {};
Data(const std::string& topic, const std::string& msg) {
this->topic = topic;
this->msg = msg;
}
};
int main() {
std::list<Data> data_list;
data_list.push_back(Data("A", std::string(1000, 'a')));
data_list.push_back(Data("B", std::string(1000, 'b')));
data_list.push_back(Data("C", std::string(1000, 'c')));
data_list.push_back(Data("D", std::string(1000, 'd')));
data_list.push_back(Data("E", std::string(1000, 'e')));
while (!data_list.empty()) {
std::cout << (void*)&data_list.front() << "\n";
Data&& d1 = std::move(data_list.front());
data_list.pop_front();
std::cout << d1.topic << ", " << d1.msg << "\n";
std::cout << (void*)&d1 << "\n\n";
}
std::cout << std::endl;
}
这里的问题是你实际上并没有移动任何东西。当您调用 std::move
时,实际上并没有移动任何东西。它所做的是将您拥有的左值转换为右值,这样它就可以被移动构造或移动分配。那不是你在这里做的。你用
Data&& d1 = std::move(data_list.front());
其中有 d1
作为右值引用,意味着不再移动,它只是对列表中对象的引用。当您弹出该元素时,您的引用现在指的是一个不再存在的对象,并且使用它具有导致您看到的输出的未定义行为。如果要移动元素,需要
Data d1 = std::move(data_list.front());
现在 d1
将使用 Data
的隐式移动构造函数将列表元素移动到 d1
.