2012-02-12 24 views
13

Hareket yapıcıların/atamanın atmasına izin verilip verilmediğine dair bazı çelişen makaleler okuyorum.Taşınan kurucuların muhtaç olması gerekiyor mu?

Bu nedenle, taşeronların/ödevlerin nihai C++ 11 standardına girmesine izin verilip verilmediğini sormak isterim?

+0

Standartta, yapıcıların atmasına izin verilmemesiyle ilgili hiçbir şey görmedim, ancak şunu gördüm: "X sınıfı için örtülü olarak bildirilen hareket oluşturucu, " X :: X (X &&) "biçiminde olacaktır. "ve orada" noexcept "göremiyorum. –

+0

Son taslakta, herhangi bir işlev için "noexcept" ifadesini göremiyorum ... – ronag

+0

@ronag: Baktığınızdan emin misin? Çünkü N3337'yi açtım ve sadece “noexcept” kelimesini aradım ve hemen bir sınıfın “swap” işlevini aldım. –

cevap

17

Kurucuların genel olarak atmasına izin verilir mi? Evet. mu?

Genel olarak, içinde hiçbir şey yapamayacağınız hiçbir şey atılmamalıdır. Hafıza ayırmamalı, başka bir kodu çağırmamalı ya da bunun gibi bir şey olmamalıdır. Bir hareket yapıcıyı yazmanın tek nedeni, başkasının bellek işaretçileri ve nesne referansları ile kaçamaktır. Birkaç temel türü kopyalamanız ve diğer nesnedeki değerleri silmeniz gerekir. Bu şeyler atmamalı.

İzin verilirken, bu iyi bir fikir değildir. Bunu yapıyorsanız, hareket operasyonlarınızda ne yaptığınızı yeniden düşünün.

+0

Hareket yapıcıda stl türlerinin atılmayacağını varsayalım mı? Endişelenmem gereken tek yer USD? – ronag

+6

@ronag: Eğer std :: type, hamle yapıcısında 'noexcept' değilse, atmasına izin verilir. Özellikle, düğüm tabanlı kapsayıcıların bazı uygulamaları, bir taşınma hamili yapıcısına sahiptir, çünkü her bir kap, bir yığın-tahsis edilmiş son düğüm, hatta boş kaplar içermelidir. Aynı kapların diğer uygulamaları, bu tasarıma sahip değildir ve bu nedenle, bağımsız bir hareket yapıcısına sahip olabilir (ve buna izin verilir). –

İlgili konular