AutoPtr 的侷限性

2021-05-24 08:47:32 字數 1297 閱讀 6001

因為std::auto_ptr是轉移語義,而stl容器的元素必須是值語義,也就是拷貝語義的。

比如,stl容器都是以副本的形式來儲存元素。

std::vectorv;

int a = 1;

v.push_back(a);

v[0]也是值為1的int,但不是a..僅僅是乙個副本.a的值也並未被改變.

std::auto_ptrp1(new int);

std::auto_ptrp2 = p1;

p2的構造修改了p1的值,使p1交出了對動態分配的int的引用權.此時p1不再引用動態int.這就是轉移語義.

另外,std::auto_ptr為了達到轉移語義的要求,只提供了這樣的乙個拷貝建構函式

auto_ptr(auto_ptr&); 而不是通常情況看到的t(const t&); 這就是乙個非值語義的表現.

而std::vector因為對元素型別要求是值語義的,所以必須要求元素型別提供t(const t&)的拷貝建構函式.

它不能用於動態建立的陣列。 

可能是因為大部分時候用std::vector就很合適了,所以沒有與auto_ptr相對應的auto_array。不過如果真的有特殊需要的話,也很容易仿照 std::auto_ptr寫個auto_array。

使用auto_ptr要知道:

1. 智慧型指標不能共享指向物件的所有權

2. 智慧型指標不能指向陣列。因為其實現中呼叫的是delete而非delete

3. 智慧型指標不能作為容器類的元素。

因為std::auto_ptr是轉移語義,而stl容器的元素必須是值語義,也就是拷貝語義的。

比如,stl容器都是以副本的形式來儲存元素。

std::vectorv;

int a = 1;

v.push_back(a);

v[0]也是值為1的int,但不是a..僅僅是乙個副本.a的值也並未被改變.

再來看std::auto_ptr

std::auto_ptrp1(new int);

std::auto_ptrp2 = p1;

p2的構造修改了p1的值,使p1交出了對動態分配的int的引用權.此時p1不再引用動態int.這就是轉移語義.

從語義上,這兩個就不相容.

另外,std::auto_ptr為了達到轉移語義的要求,只提供了這樣的乙個拷貝建構函式

auto_ptr(auto_ptr&); 而不是通常情況看到的t(const t&); 這就是乙個非值語義的表現.

而std::vector因為對元素型別要求是值語義的,所以必須要求元素型別提供t(const t&)的拷貝建構函式.

時代侷限性

時代侷限性的 什麼是時代侷限性?根本原因是理性能力的有限性。一般而言,我們能對問題提出具有一定一般性的解釋並經過一些檢驗,這樣的知識獲取就可以算作理性推知了。至少包括 能理清邏輯 確立因果的解釋是稀有的。不經過思考屬於迷信權威。主要指實踐中的試錯成分。試錯得到的結果有可能缺乏可解釋性。一味堅持過去實...

SQLite的侷限性

sql 92特性方面 正如前面提到的,sqlite不支援sql 92的在很多企業資料庫系統中可用的一些特性。如 外來鍵約束 可解析的,但非強制 很多alter table特性 一些trigger相關的特性 right和full outer join 更新乙個view grant和revoke 你可以...

SQLite的侷限性

sqlite和其他大部分現代sql資料庫在基本設計目標上是不同的,它的目標是簡單。sqlite遵循這一目標,即使這樣偶爾會導致某些特性實現的低效化。下面列舉了sqlite的一些缺陷 sql 92特性方面 正如前面提到的,sqlite不支援sql 92的在很多企業資料庫系統中可用的一些特性。如 外來鍵...