簡體   English   中英

我保證在向量移動后指向std :: vector元素的指針是有效的嗎?

[英]Am I guaranteed that pointers to std::vector elements are valid after the vector is moved?

考慮這個例子:

std::vector<int> v1 = { 1, 2, 3 };
const int* i = &v1[1];
std::vector<int> v2(std::move(v1));
std::cout << *i << std::endl;

盡管在許多STL實現中這可能會起作用,但是我保證標准是當移動std::vector時沒有執行重新分配,並且內部緩沖區支持v2與以前的v1 我無法在互聯網上找到這些信息,也無法在標准本身上找到這些信息。

這是LWG公開發行2321 [強調我的]

應該(通常)需要移動容器來保存迭代器

[...]

[作者:Stephan T. Lavavej]
23.2.1 [container.requirements.general] / 10表示除非另有說明,“否swap()函數使引用被交換容器元素的任何引用,指針或迭代器無效。[注意:end()迭代器不引用任何元素,因此可能無效。 - 結束注釋]“。 但是,移動構造函數和移動賦值運算符沒有給出類似的失效保證。 保證需要幾個例外,所以我不相信像#11這樣的全面語言,除非另有說明(顯式或通過根據其他函數定義函數),調用容器成員函數或將容器作為參數傳遞給a庫函數不應使迭代器無效,或改變該容器內對象的值。“ 適用。

[2014-02-13 Issaquah]

關於意圖,一些措辭尼特和其他段落的一般意見。

STL提供更新的措辭。 移至開放。

擬議決議:

[...]

沒有移動容器的構造函數( array除外)使引用源容器元素的任何引用,指針或迭代器無效。 [ 注意: end()迭代器不引用任何元素,因此它可能無效。 - 結束說明 ]

因此,這是一個懸而未決的問題,對其基本解決方案達成了一致意見(指針不應通過移動無效)。 但是,它還沒有被正式接受(但是?)作為缺陷。 據我所知,所有主要實現都不會在移動構造時使指針無效,並且它似乎是一般(隱式)提供的保證。

cppreference.com聲明:

...有選項,但不是必需的,移動參數所持有的任何資源......

看起來std::move只是向庫提示通過轉移所有權進行優化是可能的,但是由庫來決定是否進行優化。

這意味着您應該假設所有指向元素的指針在移動后都無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM