Bir vektör geçersiz kullanımına hareketli?
Bir vektör için bir yineleyici var, sonra inşa hareket veya hareket-ata o vektör başka bir vektör ise, bu yineleyici hala yeni vektör geçerli bir unsur olabilir mi? Burada basit bir örnek:
#include <vector>
#include <iostream>
int main(int argc, char *argv[])
{
std::vector<int>::iterator a_iter;
std::vector<int> b;
{
std::vector<int> a{1, 2, 3, 4, 5};
a_iter = a.begin() 2;
b = std::move(a);
}
std::cout << *a_iter << std::endl;
return 0;
}
Geçerli a
b
, taşındı ya da yineleyici hareket tarafından geçersiz olduğundan a_iter
hala? Başvuru, std::vector::swap
does not invalidate iteratorsiçin.
CEVAP
iterator
hala ** 7, sonra geçerli olduğunu varsaymak makul olabilir ancak bu Standart aslında bu garanti sanmıyorum. Bu nedenle, kullanımına move
sonra tanımsız bir durumdadır.
Hangi Standart bulabilirim referans yoközellikle belirtiyormove
Bir önce ki kullanımına hala geçerlidirsonramove
.
Yüzeyde, iterator
Bir olduğunu varsaymak makul gibi görünüyorgenellikledenetlenen sırası için işaretçiler olarak uygulanır. Eğer durum buysa, o zaman kullanımına hala move
sonra geçerli olur.
Ama iterator
bir uygulama uygulama tanımlı. Belirli bir platform üzerinde iterator
gereksinimleri Standart tarafından belirlenen karşıladığından sürece anlamı, herhangi bir şekilde uygulanabilir. Teorik olarak, bir işaretçi bir arada olarak bir dizin ile birlikte vector
sınıfı uygulanabilir. Eğerbubu durumda, daha sonra kullanımına move
sonra geçersiz olacak.
Ya da değil iterator
aslında uygulanıp bu şekilde ilgisi yoktur. Bu şekilde uygulanan olabilir, post-move
kullanımına hala geçerli olan Standart belirli bir garanti olmadan, onlar kabul edemiyor. Akılda tutulması da o varswap
sonra kullanımına için böyle bir garanti. Bu özellikle bir önceki Standart açıklığa kavuşmuştur. Belki de sadece Std Kuruluna bir gözetim ** 20, sonra kullanımına benzer bir açıklama yapmak için değil, ama her durumda böyle bir garanti yok.
Bu nedenle, uzun lafın kısası senin kullanımına hala move
sonra iyi olduğunu kabul edemeyiz.
DÜZENLEME:
Taslak 23.2.1/11 n3242 Birleşik Devletleri:
Aksi takdirde (açıkça ya da tanımlayarak ya belirtilmediği sürece diğer fonksiyonlar açısından) işlevi, kapsayıcı bir üye çağırma işlev ya da kütüphane bir işlev için bağımsız değişken olarak bir kap geçirilmesi ya da değerleri değiştirmek, nesneleri kullanımına geçersiz olmayacaktır o kabın içinde.
Bu bir yineleyicisi ** 22, sonra geçerli olmadığı sonucuna götürebilir ama ben katılmıyorum. Örnek kodu a_iter
vector
a
Bu bir yineleyici. move
, sonra o kabı a
kesinlikle değişti. Sonucum yukarıdaki fıkra bu durumda geçerli değildir.
Hareketli bir git deposu...
Neden C bir Vektör bir Vektör denir?...
Profil Yükleme Başarısız oldu Testflig...
Geçersiz ActiveRecord yöntemleri öznit...
Nasıl çift çifti ikinci unsuru tabanlı...