SORU
13 HAZİRAN 2012, ÇARŞAMBA


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
13 HAZİRAN 2012, ÇARŞAMBA


iteratorhala ** 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 aBu bir yineleyici. move, sonra o kabı a kesinlikle değişti. Sonucum yukarıdaki fıkra bu durumda geçerli değildir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • atKristaBradford

    atKristaBrad

    4 Aralık 2010
  • Jared Busch

    Jared Busch

    25 Mayıs 2011
  • kidrauhl

    kidrauhl

    15 Ocak 2007