Tôi đang học C++ 11 và tôi có một câu hỏi liên quan đến di chuyển ngữ nghĩa và tham khảo rvalue. mẫu mã của tôi là như sau (C++ Shell URL là cpp.sh/8gt):Tại sao std :: di chuyển là cần thiết để gọi di chuyển gán nhà điều hành của std :: vector
#include <iostream>
#include <vector>
void aaa(std::vector<int>&& a)
{
std::cout << "size of a before move: " << a.size() << std::endl;
std::vector<int> v;
v = a; /*std::move(a)*/
std::cout << "size of a after move: " << a.size() << std::endl;
}
int main()
{
std::vector<int> foo (3,0);
aaa(std::move(foo));
return 0;
}
Kết quả của việc này là:
size of a before move: 3 size of a after move: 3
Có vẻ như các nhà điều hành di chuyển assign của std :: vector không được gọi tại dòng v = a
trong hàm aaa
, nếu không a
sẽ có kích thước 0 thay vì 3.
Tuy nhiên nếu tôi thay đổi v = a
-v = std::move(a)
đầu ra trở thành
kích thước của một trước khi di chuyển: 3
kích thước của một sau khi di chuyển: 0
và tôi thinke các nhà điều hành di chuyển assign của std :: vector đã được viện dẫn này thời gian.
Quesiton của tôi là lý do tại sao toán tử gán không được gọi lần đầu tiên? Theo tham chiếu C++ std :: vector có một toán tử gán có tham chiếu rvalue.
bản sao (1) vector & operator = (const vector & x);
di chuyển (2) vectơ & nhà điều hành = (vector & & x);
danh sách bộ khởi tạo (3) vector & toán tử = (initializer_list il);
Sau đó, tại dòng v = a
, vì được khai báo là tham chiếu rvalue, toán tử di chuyển sẽ được gọi. Tại sao chúng ta vẫn cần bọc một std :: move?
Rất cám ơn trước!
[sửa] Tôi nghĩ cả Loopunroller và SB Kerrek đều trả lời câu hỏi của tôi. Cảm ơn! Tôi không nghĩ rằng tôi có thể chọn hai câu trả lời vì vậy tôi sẽ chỉ chọn câu trả lời đầu tiên.
Biểu thức đề cập đến tham chiếu rvalue * biến * là một giá trị lvalue, vì bạn có thể tham khảo biến nhiều lần. – dyp
Bởi vì "tham chiếu rvalue" là một tên xấu và khó hiểu. Và bởi vì C++ là xấu và khó hiểu. –
Đây là, tất nhiên, một điều tốt (một cách xấu và khó hiểu). Nếu không, 'v = a' sẽ âm thầm sửa đổi' a', gây ra chính xác kiểu 'weird_ptr'-style weirdness mà di chuyển ngữ nghĩa được dự định để tránh. –