2014-09-26 67 views
5

我非常支持使std::shared_ptr<T>構造函數接受T *顯式的想法。它有助於節省不眠之夜,當你正在查看堆腐敗的原因。 Scott Meyers給出了一個很好的解釋。std :: shared_ptr <T>:隱式構造函數的右值指針T


但是......如果我給它一個rvalue指針是不是明確的?我可以做這樣的事情:

/// (1) 
std::shared_ptr<T> t = new T; 

/// (2) 
T * giveaway = new T; 
std::shared_ptr<T> t = std::move(giveaway); 

或從現實生活更加痛苦的情況下

/// (3) 
void foo(std::shared_ptr<T> t); 
/// ... 
foo(new T); 

對我來說,所有這些情況都不夠明確。 (1)是一個prvalue,我不可能把自己搞砸有兩個指針。至少不能使用:

std::shared_ptr<T> t{new T}; 

情況(2)非常明確。一致認爲,在你移動了某個東西之後,它的價值變得不確定。所以使用它完全在你身上。 (3)再次爲rvalue


(Q1)它這是標準委員會的眺望嗎?

(Q2)這是有原因嗎?

(Q3)隱式構造函數接受rvalue出現在C++ 14中的任何機會?

+2

到Q3:C++ 14是官方的,並沒有改變。 – Deduplicator 2014-09-26 08:03:13

+0

我錯過了什麼嗎?爲什麼不使用make_shared? – 2014-09-26 08:04:27

+0

@MarcoA。同樣的原因,我們不使用'std :: string(「literal」)',我們將字面值傳遞給接受'std :: string'的函數。它很簡單。 – GreenScape 2014-09-26 08:06:35

回答

8

還有一個原因,甚至給人一種右值不允許智能指針的隱式建築從原始指針:

它是不是安全。

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

因此,你的問題的另外兩個部分:

  1. 它不是由該委員會的監督。

而且

  • 它不會出現在未來的C++ - 標準(反正C++ 14是伸出並沒有出現)。
  • +0

    事實上,我沒有想到在這個方向上...... – GreenScape 2014-09-26 08:10:52