Ví dụ mã:Di chuyển ngữ nghĩa và các loại nguyên thủy
int main()
{
std::vector<int> v1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << "Printing v1" << std::endl;
print(v1);
std::vector<int> v2(std::make_move_iterator(v1.begin()),
std::make_move_iterator(v1.end()));
std::cout << "Printing v1" << std::endl;
print(v1);
std::cout << "Printing v2" << std::endl;
print(v2);
std::vector<std::string> v3{"some", "stuff", "to",
"put", "in", "the", "strings"};
std::cout << "Printing v3" << std::endl;
print(v3);
std::vector<std::string> v4(std::make_move_iterator(v3.begin()),
std::make_move_iterator(v3.end()));
std::cout << "Printing v3" << std::endl;
print(v3);
std::cout << "Printing v4" << std::endl;
print(v4);
}
Output:
Printing v1
1 2 3 4 5 6 7 8 9 10
Printing v1
1 2 3 4 5 6 7 8 9 10
Printing v2
1 2 3 4 5 6 7 8 9 10
Printing v3
some stuff to put in the strings
Printing v3
Printing v4
some stuff to put in the strings
Câu hỏi
Kể từ khi hoạt động di chuyển o n loại nguyên thủy chỉ là một bản sao, tôi có thể giả định rằng
v1
sẽ không thay đổi hoặc trạng thái không xác định ngay cả với các kiểu nguyên thủy không?Tôi giả định lý do tại sao các kiểu nguyên thủy không có ngữ nghĩa di chuyển là vì sao chép nhanh hoặc thậm chí nhanh hơn, điều này có đúng không?
Quy tắc "trạng thái hợp lệ nhưng không xác định" chỉ áp dụng cho các loại thư viện chuẩn ([lib.types.movedfrom]). Các kiểu nguyên thủy "Di chuyển" được điều khiển bởi các quy tắc ngôn ngữ cốt lõi, và đối với các loại như vậy, một động thái là một bản sao. –