Sau ngày từ một bình luận tôi đã thực hiện về vấn đề này:người dân địa phương được trả về tự động xvalues
passing std::vector to constructor and move semantics Là std::move
cần thiết trong đoạn mã sau, để đảm bảo rằng giá trị trả về là một Xvalue?
std::vector<string> buildVector()
{
std::vector<string> local;
// .... build a vector
return std::move(local);
}
Tôi hiểu rằng điều này là bắt buộc. Tôi thường thấy này được sử dụng khi trả lại một std::unique_ptr
từ một chức năng, tuy nhiên GManNickG đưa ra nhận định sau đây:
Đó là sự hiểu biết của tôi rằng trong một tuyên bố trở lại tất cả các biến địa phương sẽ được tự động xvalues (đáo hạn giá trị) và sẽ được chuyển , nhưng tôi không chắc liệu điều đó chỉ áp dụng cho chính đối tượng được trả về hay không. Vì vậy, OP nên đi trước và đặt đó trong đó cho đến khi tôi tự tin hơn nó không cần phải được. :)
Có ai có thể làm rõ nếu std::move
là cần thiết không?
Trình biên dịch hành vi có phụ thuộc không?
Lưu ý bạn đã gây ra cho tôi để kể từ khi sửa đổi tuyên bố của tôi. Nó chỉ là giá trị trả về được di chuyển (có thể là biến cục bộ), không phải tất cả các biến cục bộ nói chung. (Mặc dù điều đó sẽ tốt đẹp, nó có thể phá vỡ trên một số mã cũ tôi không thể nghĩ đến, và C + + tiến triển đã duy trì khả năng tương thích ngược.) – GManNickG