Chúng tôi có chức năng thuận tiện sau đây tìm nạp giá trị từ bản đồ hoặc trả lại giá trị mặc định dự phòng nếu không tìm thấy khóa.không cho phép chuyển tham chiếu rvalue sang hàm
template <class Collection> const typename Collection::value_type::second_type&
FindWithDefault(const Collection& collection,
const typename Collection::value_type::first_type& key,
const typename Collection::value_type::second_type& value) {
typename Collection::const_iterator it = collection.find(key);
if (it == collection.end()) {
return value;
}
return it->second;
}
Vấn đề với chức năng này cho phép chuyển đối tượng tạm thời làm đối số thứ ba sẽ là lỗi. Ví dụ:
const string& foo = FindWithDefault(my_map, "");
Có thể không cho phép đi tham khảo rvalue với số thứ ba một cách nào đó bằng cách sử dụng std :: is_rvalue_reference và khẳng định tĩnh?
Nó cảm thấy thực sự trực quan để vượt qua '" "' ở đó. Nó sẽ là tốt hơn để tìm một cách để ngăn chặn 'FindWithDefault' từ bị ràng buộc để tham khảo, ngoại trừ tôi không nghĩ rằng có một. Dù sao, nó sẽ là tốt hơn để chỉ đơn giản là làm cho 'foo' một giá trị trong ví dụ này. –
Các vấn đề khác với câu hỏi này là bạn đã nhảy vào những gì bạn nghĩ là giải pháp, thay vì nêu rõ vấn đề. Khi làm như vậy, bạn đã tập trung vào các tham chiếu rvalue nhưng đó không phải là vấn đề duy nhất; một tham chiếu lvalue-to-'const'-tạm thời sẽ cắn bạn chỉ là khó khăn. Có lẽ lấy giá trị 'value' mặc định. –
Bạn có thể trả về bằng giá trị thay vì trả lại bằng tham chiếu. Điều này có vẻ khá tự nhiên cho một tìm-với-mặc định. – galinette