2012-11-28 60 views
1

我在閱讀an article關於有效使用auto_ptr。在那裏,下面的代碼被認爲是正確的一段代碼:分配原始指針到auto_ptr

// Example 10(c): Correct (finally!) 
// 
auto_ptr<String> f() 
{ 
    auto_ptr<String> result = new String; 
    *result = "some value"; 
    cout << "some output"; 
    return result; // rely on transfer of ownership; 
        // this can't throw 
} 

但據我所知,中auto_ptr賦值運算符只接受另一auto_ptr作爲rhs - 以避免意外的誤操作。那麼,下面這行是文章中的一個錯字,還是真的假裝工作?

auto_ptr<String> result = new String; 

回答

5

該行確實是不正確的,但不是因爲您的想法。它不調用賦值運算符,而是調用構造函數。當您第一次聲明對象時說=時,它不會創建該對象,然後調用賦值運算符。相反,它只是調用構造函數並將其作爲參數傳遞。所以從這個觀點來看,這是「正確的」,因爲它使用的是構造函數,而不是使用賦值運算符

或者至少如果可以的話。你會注意到std::auto_ptr的構造函數需要一個指針。但是,它標記爲explicit,這意味着上述「捷徑」是不允許的。您必須顯式調用構造函數(帶圓括號),並且不能使用=作爲此操作的快捷方式。這就是它不正確的原因。如果他們說auto_ptr<String> result(new String);,一切都會好起來的。另外,如果構造函數未標記爲explicit,則一切正常。但事實確實如此,這是不正確的。

+0

你是對的,+1。 – jogojapan

+0

但是關於你對治療者(現在已刪除)答案的評論:當然這涉及拷貝構造函數。你的回答是正確的,爲什麼問題中說明的初始化不起作用。但是這是複製初始化也是正確的,它涉及拷貝構造函數。 (對拷貝構造函數的實際調用可能會被優化掉,但這是另一回事。) – jogojapan

+0

@jogojapan:嗯,每天學習一些新東西。有什麼地方可以閱讀更多(比標準更少的法律語言)關於何時調用構造函數,這將解釋更多(在編譯器優化它們之前)? – Cornstalks