Taşınan obyektlə nə edə bilərəm?

Standart onu daşıyandan sonra obyektlə nə edə biləcəyimi müəyyən edirmi? Mən düşünürdüm ki, köçürülmüş bir obyektlə nə edə biləcəyiniz hər şeyi məhv edir, amma bu kifayət deyil.

Məsələn, standart kitabxanada göstərildiyi kimi swap funksiyası şablonunu götürün:

 template <typename T> void swap(T a, T b) { T c = std::move(a); // line 1 a = std::move(b); // line 2: assignment to moved-from object! b = std::move(c); // line 3: assignment to moved-from object! } 

Aydındır ki, yerdəyişən obyektləri təyin etmək mümkündür, əksinə, 2 və 3-cü xəttlər uğursuz olardı. Taşınmış obyektlərlə başqa nə edə bilərəm? Bu məlumatları standartda tam olaraq harada tapa bilərəm?

(Yeri gəlmişkən, niyə T c = std::move(a); , T c(std::move(a)); yerinə T c(std::move(a));

119
11 авг. fredoverflow tərəfindən təyin 11 aug. 2011-08-11 17:19 '11 at 17:19 2011-08-11 17:19
@ 2 cavablar

Taşınmış obyektlər müəyyən edilməmiş, lakin etibarlı vəziyyətdə mövcuddur. Bu, obyektin artıq edə bilməməsinə baxmayaraq, bütün üzv funksiyaları hələ də müəyyən bir davranış nümayiş etdirməlidir, o cümlədən operator= bütün üzvləri müəyyən bir vəziyyətdə - bu hələ də məhv edilməlidir. Standart hər bir UDT üçün unikal olacaq, ancaq müəyyən standartlar üçün spesifikasiyaları tapa bilərsiniz. Bu konteynerlərdən bəziləri nisbətən aydındır. sadəcə onların məzmununu ətrafında hərəkət etdirirlər və boş bir konteyner müəyyən bir icazə verilmiş dövlətdir. Primitives daşınan obyekti dəyişmir.

Yadda qeyd: Məncə bu T c = std::move(a) , buna görə hərəkət konstruktoru (və ya heç bir hərəkət müəyyən edilmədiyi təqdirdə konstruktor) aydın görünürsə, funksiya uğursuz olacaqdır.

46
11 авг. cavab Puppy 11 aug verilir . 2011-08-11 17:30 '11 saat 17:30 'da 2011-08-11 17:30

17.6.5.15 [lib.types.movedfrom]

Standart C ++ kitabxanasında müəyyən edilmiş obyektlərin növü (12.8) -dən köçürülə bilər. Move əməliyyatları açıq şəkildə müəyyən edilə bilər və ya gizli şəkildə yaradıla bilər. Aksi qeyd edilmədiyi təqdirdə, belə köçürülmüş obyektlər etibarlı, lakin müəyyən edilməmiş hallarda yerləşdirilməlidir.

Bir obyekt müəyyən edilmədikdə, hər hansı bir əməliyyatda heç bir ön şərt yoxdur. Gerçekleştirmek istediğiniz önkoşulları olan bir işlem varsa, bu işlemi birbaşa gerçekleştiremezsiniz, çünki müəyyən olmayan şartın koşulunun ön koşulları karşılayıp karşılamadığını bilmirsiniz.

Əvvəlcədən şərtləri olmayan əməliyyatlar nümunələri:

border=0
  • məhv
  • Məqsəd
  • Const müşahidəçiləri, məsələn, get , empty , size

Əvvəlcədən şərtləri olan əməliyyatlar nümunələri:

  • dereference
  • pop_back

İndi bu cavab video formatında görünür: http://www.youtube.com/watch?v=vLinb2fgkHk>

11 авг. Cavab Howard Hinnant 11 aug tərəfindən verilir . 2011-08-11 18:09 '11 at 18:09 2011-08-11 18:09

Etiketler haqqında digər suallar və ya bir sual