2013-02-25 17 views
14

Mã có đúng không?Một unique_ptr có giá trị nullptr không?

unique_ptr<A> p(new A()); 
p = nullptr; 

Tôi có nên sử dụng nullptr với một * unique_ptr *? hoặc nó sẽ thất bại?

Tôi thử trên g ++, nhưng, Còn về trình biên dịch khác thì sao?

Trả lời

26

Nó sẽ hoạt động.

Từ Đoạn 20.7.1.2.3/8-9 của C++ 11 tiêu chuẩn về unique_ptr<> lớp mẫu:

unique_ptr& operator=(nullptr_t) noexcept;

Hiệu ứng: reset().

hậu: get() == nullptr

Điều này có nghĩa rằng định nghĩa của lớp mẫu unique_ptr<> bao gồm một quá tải của operator = chấp nhận một giá trị kiểu nullptr_t (như nullptr) như phía bên tay phải của nó; đoạn này cũng quy định rằng việc gán nullptr cho một unique_ptr tương đương với việc đặt lại unique_ptr.

Do đó, sau bài tập này, đối tượng A của bạn sẽ bị hủy.

+0

Tôi hiểu. BTW, chỉ nullptr có nullptr_t, đó là cách nó được thực hiện, phải không? – Zhen

+1

@Zhen: Tiêu chuẩn không quy định điều này. Bạn có thể tạo một biến kiểu 'nullptr_t', nhưng tôi nghi ngờ bạn sẽ cần phải làm điều đó. –