Tôi hỗ trợ khá nhiều ý tưởng làm cho một hàm tạo std::shared_ptr<T>
chấp nhận T *
rõ ràng. nó giúp để tiết kiệm đêm không ngủ, khi bạn đang tìm kiếm lý do trên đống tham nhũng. Scott Meyers đã giải thích rõ điều này.std :: shared_ptr <T>: hàm tạo ngầm cho con trỏ rvalue đến T
Nhưng ... Nếu tôi cung cấp cho nó thì con trỏ rvalue
không rõ ràng? Tôi có thể làm những việc như:
/// (1)
std::shared_ptr<T> t = new T;
hoặc
/// (2)
T * giveaway = new T;
std::shared_ptr<T> t = std::move(giveaway);
hoặc một trường hợp nhiều đau đớn hơn từ cuộc sống thực
/// (3)
void foo(std::shared_ptr<T> t);
/// ...
foo(new T);
Đối với tôi, tất cả những trường hợp này là đủ rõ ràng .
Trường hợp (1) là prvalue
, tôi không thể tự sửa lỗi bằng hai con trỏ. Ít nhất không quá sử dụng:
std::shared_ptr<T> t{new T};
Trường hợp (2) khá rõ ràng. Nó được đồng ý rằng sau khi bạn đã di chuyển một cái gì đó giá trị của nó trở thành không xác định. Vì vậy, sử dụng nó là hoàn toàn vào bạn.
Trường hợp (3) lại là rvalue
.
(Q1) Nó đây là một Overlook bởi ủy ban tiêu chuẩn?
(Q2) Có lý do nào cho điều này không?
(Q3) Bất kỳ cơ hội nào để hàm tạo ngầm chấp nhận rvalue
xuất hiện trong C++ 14?
Đến Q3: C++ 14 là chính thức và điều đó không thay đổi. – Deduplicator
Tôi đã bỏ lỡ điều gì đó? Tại sao không sử dụng make_shared? –
@MarcoA.Cùng một lý do chúng ta không sử dụng 'std :: string (" literal ")' ở khắp mọi nơi mà chúng ta truyền chữ đến hàm có chấp nhận 'std :: string'. Đó là sự đơn giản. – GreenScape