2014-09-26 14 views
5

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?

+2

Đến Q3: C++ 14 là chính thức và điều đó không thay đổi. – Deduplicator

+0

Tôi đã bỏ lỡ điều gì đó? Tại sao không sử dụng make_shared? –

+0

@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

Trả lời

8

Có một lý do thậm chí đưa ra một rvalue không cho phép xây dựng ngầm của một smart-con trỏ từ một nguyên con trỏ:

Nó không phải là an toàn.

void foo(std::shared_ptr<T> t); 
char buffer[42]; 
foo(buffer+7); // buffer+7 is a rvalue, and would implicitly convert! 

Vì vậy, để hai bộ phận khác của câu hỏi của bạn:

  1. Nó không phải là một sự giám sát của ủy ban.

  1. Nó sẽ không xuất hiện trong một tương lai C++ - Tiêu chuẩn (Dù sao, C++ 14 là ra ngoài và nó không xuất hiện).
+0

Thật vậy, tôi không nghĩ theo hướng này ... – GreenScape

Các vấn đề liên quan