auto ptr為什麼不能做為vector的元素

2022-07-22 03:27:12 字數 1274 閱讀 5915

昨天看effectve c++的時候,發現了auto_ptr這個東西。由於我待過的公司都是用的老版c++,**裡智慧型指標什麼的完全沒有出現過,都是直接操作的原始指標。雖說我很少出錯,但是總歸還是不太安全。言歸正傳,說回auto_ptr,這個東西一開始我也見過,但是當時在趕專案也就沒有怎麼上心,這回正好看到了,就詳細了解下。

在effiectev c++中我了解到,這是老版c++裡的智慧型指標(之前我只知道c++11裡的share_ptr和unique_ptr),同乙個物件從始至終只會有乙個auto_ptr指向它,也就是說當指向某個物件的auto_ptr被拷貝時(拷貝構造或者是賦值),原auto_ptr會被置為null。當指向物件的auto_ptr離開作用域後,會自動呼叫析構函式,從而達到防止資源洩露的目的。

很自然的,我想將我最近的新專案由操作裸指標改為智慧型指標,因為在專案中用到了stl標準容器,所以打算先用vector測試下auto_ptr。測試**如下:

#include#include

#include

class

test

~test()

};int

main()

編譯時,提示auto_ptr過時的警告就不提了,報錯如下:

/usr/include/c++/7/ext/new_allocator.h:136:4: error: no matching function for call to 『std::auto_ptr::auto_ptr(const std::auto_ptr&)』 

當時可能警告加報錯資訊太長,我沒有看到這個const。。。然後想了很久想不通為什麼不行,我當時的理解是vector將auto_ptr拷貝進去,原auto_ptr將變為0。然後懷疑自己將vector的push_back操作記錯了,開啟stl原始碼解析,找到vector加入元素時構造的函式:

template inline 

void construct(t1* p, const t2&value)

嗯?我沒記錯啊,為什麼不能呢?然後我去網上搜了下,知道真相的我眼淚掉了下來。很簡單:

因為將auto_ptr拷貝時需要對原auto_ptr進行修改,也就是將原auto_ptr置為null,所以不能支援以const的方式進行拷貝構造!

也就是說,auto_ptr是不能做為stl標準容器的元素的。

對於這個疑問的出現,我想一方面是自己不夠細心,沒有仔細看報錯的含義;另一方面是自己的思維還有點欠缺,明明知識點都知道,但是沒聯想到。

為什麼不能做除數

在 乘除法的認識 的教學中,對於 0不能做除數 的規定,常說 零做除數沒有意義 或 規定零不能做除數 許多教師往往只是把它當作乙個結論來處理,強調 0做除數,沒有意義 其實這正是 乘除法關係 的乙個極好的例子.究竟 零為什麼不能做除數 呢?這可從兩個方面談起 一 當被除數是零,除數也是零時,我們可寫...

Excel Service能做什麼和不能做什麼

moss 2007中包含了乙個excel service,很多朋友都對其相當感興趣。這裡要介紹一下它的組成部分,以及具體它能做什麼和不能做什麼 下面這個位址是官方的blog 從下圖可以看出,它包含前端和後端兩個部分,前端的excel web access是給sharepoint用來作為web par...

為什麼 i 不能做左值,而 i 可以

算下來已經很久以前了,大概有那麼幾個星期了吧。看到了帖子上有人問為什麼下面的語句的對錯原因 int i 0 int ip i 錯誤 int ip i 正確 看到上面的語句,當時以為兩個都是是對的啊,可是當我用vs2010的編譯器試了試之後,才發現第乙個取位址確實是錯誤的語句,具體的提示是 error...