2016-06-06 17 views
8

olur edildiğinde aşağıdaki üye fonksiyonlara sahiptir:dönüş değeri için kopya yapıcısı

Person ClassB::DoSomethingAndReturnPerson() 
{ 
RAIIMutex myLock(&m_mutex); 
return m_person; 
} 

RAIIMutex bir Muteksleri recieves ve yıkıcı yapıcı ve bültenleri bunu kilitler bir yardımcı sınıftır.

m_person, Person tipindedir (boyut olarak çok küçük bir şey). Diğer üyelerde bulunan diğer işlevler bu üyeyi değiştirebilir.

Ben değeriyle m_person dönmek istiyorum (bir kopyasını döndürmek) ve tabii ki ben kilidi ekledik böylece karşılığında kopyalanan esnada m_person başka bir iplik değiştirilmesini durumu önlemek istiyor.

Ama önce ne olur? Derleyici ilk olarak m_person'un bir kopyasını oluşturur mu yoksa ilk önce myLock destructor'ını arar mı?

böyle bir şey yaparak Teorik olarak tefriş çözülebilir:

Person ClassB::DoSomethingAndReturnPerson() 
{ 
RAIIMutex myLock(&m_mutex); 
Person tmp = m_person; 
return tmp; 
} 

Ama sorunun cevabını bilmeden ilgileniyorum.

sayesinde yerel nesnelerin

+0

[OT] Sen '[' std :: lock_gurad'] (http://en.cppreference.com/w/cpp/thread/lock_guard) – NathanOliver

+1

kopya yapıcısı olarak adlandırılan olmayabilir ile RAIIMutex' yerini alabilir [kopya elence] nedeniyle (https://en.wikipedia.org/wiki/Copy_elision). –

+1

@JoachimPileborg Bu 'm_person' bir sınıf üyesi değişkeni gibi görünüyor şüphelidir. – NathanOliver

cevap

10

kopya-başlatma belirtildiği gibi bir sınıf nesnesi ya da kopya/taşıma ortadan durumu dışında, kullanılmamış olduğu görünse bile bir iyileştirme kaldırılacaklardır iade edilen değer daha önce işlenecektir. standart kaynaktan

, $6.6.3/3 The return statement [stmt.return] (vurgu benim)

geri varlığın kopyalama başlatma bölgesinin işlenen ile kurulan tam ifade sonunda geçicilerin yok edilmesinden önce sekanslanır Sırasıyla, geri bildirimini içeren bloğunun lokal değişkenlerinin (6.6) yok edilmesinden önce sıralanan dönüş beyanı.

+0

Teşekkürler, standardı nerede bulabilirim? Ücretsiz olarak kullanılabilir mi? – OopsUser

+0

@OopsUser [Geçerli C veya C++ standart belgelerini nerede bulabilirim?] (Http://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or adresini görmek isteyebilirsiniz) -c-standard-documents) veya [Definitive C++ Kitap Rehberi ve Listesi] (http://stackoverflow.com/a/388282/3309790), temel olarak, [standardizasyondan önceki son taslak] (http: // www. open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf) daha fazla (ve ücretsiz). – songyuanyao

-1

Yokediciler 'kodunuzun son satırında' sonra denir. Burada Standard alakalı bir tırnak (3.7.3/3) ':

otomatik depolama süresi ile değişken bir başlatma ya da yan etkileri olan yıkıcı varsa, sonunda önce yok edilemez onun blok, ne de bunun 12.8

+0

Yani kopya oluşturucudan önce mi sonra mı olacak? Kopya kurucusu benim kodumun bir parçası değil, derleyici bu – OopsUser

+0

OopsUser'i kullanıyor, @songyuanyao tarafından verilen cevap bile daha iyi fiyat teklifi veriyor. Kopya oluşturucudan sonra, eğer çağrılırsa. – SergeyA