Theo thứ tự tốt nhất để tồi tệ hơn:
- someFunction (const T &);
- someFunction (T &);
- someFunction (const std :: unique_ptr <T> &);
- someFunction (std :: unique_ptr <T> &);
Cách đầu tiên là tốt nhất vì nó không sửa đổi đối tượng và nó sẽ hoạt động với đối tượng bất kể bạn phân bổ như thế nào (ví dụ: bạn có thể chuyển sang shared_ptr mà không gặp vấn đề gì).
Số hai cũng sẽ hoạt động bất kể con trỏ thông minh bạn đang sử dụng; tuy nhiên, nó giả định rằng bạn có thể sửa đổi đối tượng, và bất cứ khi nào bạn có thể làm một cái gì đó const, bạn nên.
Cả số 3 và 4 đều cho phép đối tượng được chỉ định bị biến đổi; tuy nhiên, # 3 không cho phép con trỏ thông minh được sửa đổi, trong khi số 4 thì không. Cả hai đều có những bất lợi mà họ buộc việc sử dụng unique_ptr, trong khi hai ở trên nó sẽ làm việc bất kể lớp con trỏ thông minh.
Chuyển giá trị unique_ptr theo giá trị, như bạn có trong một số ví dụ khác không phải là một tùy chọn; một unique_ptr được cho là duy nhất. Nếu bạn đang sao chép nó, hãy cân nhắc sử dụng shared_ptr.
Đối với lần đầu tiên hai, nếu bạn gọi nó trên kết quả của back(), nó sẽ trông giống như:
someFunction(*(lst.back())); // dereference lst.back() before passing it in.
Đối với hai nước này, nếu bạn gọi nó trên resut lưng(), nó sẽ như thế nào:
someFunction(lst.back()); // pass the smart pointer, not the object to
// which the smart pointer currently points.
Nguồn
2010-07-11 11:55:11
Cảm ơn sâu lời giải thích. Vì vậy, không có ngữ nghĩa đặc biệt là cần thiết cho con trỏ thông minh (ngoại trừ dereferencing). Tôi biết về những thứ 'const', nhưng trong trường hợp này tôi cần sửa đổi đối tượng' T' được truyền vào. – rubenvb