Tôi có một chức năng mà sẽ thay đổi std::string&
tài liệu tham khảo giá trị trái tại chỗ, trở về một tham chiếu đến các tham số đầu vào:Tôi có nên trả lại tham số tham chiếu rvalue bằng tham chiếu rvalue không?
std::string& transform(std::string& input)
{
// transform the input string
...
return input;
}
Tôi có một hàm helper cho phép biến đổi inline cùng được thực hiện trên tài liệu tham khảo rvalue:
std::string&& transform(std::string&& input)
{
return std::move(transform(input)); // calls the lvalue reference version
}
Lưu ý rằng số trả về tham chiếu rvalue.
Tôi đã đọc một số câu hỏi về SO liên quan đến các tham chiếu rvalue trả về (ví dụ: here và here) và đã đi đến kết luận rằng đây là thực hành không tốt.
Từ những gì tôi đã đọc, có vẻ như sự đồng thuận là sau khi trở về giá trị là rvalues, cộng thêm có tính đến RVO, chỉ cần trở lại theo giá trị sẽ là hiệu quả:
std::string transform(std::string&& input)
{
return transform(input); // calls the lvalue reference version
}
Tuy nhiên, tôi cũng đã đọc rằng trở về thông số chức năng ngăn ngừa sự tối ưu hóa RVO (ví dụ here và here)
Điều này dẫn tôi để tin rằng một bản sao sẽ xảy ra từ giá trị std::string&
trở lại của phiên bản tài liệu tham khảo vế trái của transform(...)
vào giá trị trả lại std::string
.
Điều đó có đúng không?
Tốt hơn là giữ phiên bản std::string&& transform(...)
của tôi?
Như một lưu ý phụ, hàm ban đầu chấp nhận và trả về '&' s bình thường là khá khó chịu - nó làm biến đổi đối tượng được truyền cho nó, nhưng nó ngụy trang trông giống như một hàm thuần túy. Đó là một công thức cho sự hiểu lầm. Đây có thể là điều khiến cho việc tìm ra phương pháp rvalue của nó trở nên khó khăn. –
Điểm của việc trả lại thứ gì đó mà người dùng đã có? Nó không giống như bạn đang chuyển đổi chuỗi cuộc gọi, phải không? – Drax
@ Drax, còn về 'std :: cout << foo (biến đổi (get_str()));'? –