Taken từ một slide tại cppcon2015:Ngăn cản dereferencing không an toàn của std :: unique_ptr
unique_ptr<A> f() {
auto a = make_unique<A>();
return a;
}
//Why does this even compile?
const A & dangling = *f();
//BOOM!!!
use(dangling);
Câu hỏi của tôi là: với sự tham khảo rvalue cho * này, có thể này được giải quyết?
tôi thấy trong spec trong cppreference:
typename std::add_lvalue_reference<T>::type operator*() const;
Câu hỏi:
- Nó có ý nghĩa để không cho phép
operator*
cho rvalueunique_ptr
s và chỉ có giá trị trong dereference vế tráiunique_ptr
s? - Vẫn còn trường hợp sử dụng hợp lệ để giữ giá trị
unique_ptr
không thể chấp nhận được?
Như thế này:
//Make sure it is an lvalue.
typename std::add_lvalue_reference<T>::type operator*() const &;
LƯU Ý: Tôi không chắc chắn của các cú pháp hoặc đúng đắn, tôi không có kinh nghiệm với sự tham khảo rvalue cho * này.
Did bạn có nghĩa là '* f();' thay vì 'f();'? –
btw. 'const &' sẽ vẫn cho phép đối tượng tiềm ẩn là một giá trị –
Còn 'auto non_dangling = f()' để tránh vấn đề thì sao? Nó thực sự là con trỏ cần được sửa? –