2012-11-04 7 views
8
void f(int count, ...){ 
    //whatever 
} 

struct somestruct{ 
    size_t a, b, c; 
}; 

int main() { 
    somestruct s; 
    f(1, s); //what is actually passed? 
} 

struct'un tamamı kopyalanmış mı ve yığının üzerine mi iletildi? Öyleyse kopya kurucular aradı mı? İşaretçi geçti mi? Bu güvenli mi?Bir yapıya bir varar işlevine geçersem ne olur?

+0

C++ hakkında soru sormalısınız; C'nin kopya kurucusu yok. –

cevap

2

bir lvalue geçirirseniz Evet, rvalue dönüşüm lvalue bir içine nesneyi kopyalamak için kopya kurucu çağırmak anlamına gelir yapılacaktır yeni kopya ve bunu bir argüman olarak aktarma.

+0

Şey ... ama hala tipin önemsiz bir şekilde kopyalanabilmesi zorunluluğu varsa (ve bunu yaparsanız, 'g ++' bir hata verirse), o zaman cevabınız ve billzınız eşdeğerdir ... ya da değil mi? –

+0

@LorenzoPistone no. kopya kurucusu silinebilir veya gizli olabilir. Mutlaka önemsiz olmayacaktır, ancak onu çağırmak kötü biçimlendirilecektir. –

1

void f(...) bit-wised kopya kullanıyor. somestruct için yalnızca C++ yerleşik türlerine sahip olduğu için varsayılan kurucu veya kopya kurucusu oluşturulmaz.

Is this safe? 

Evet, bu kesinlikle güvenlidir.

Sana etmek 'İçinde C++ Nesne Modeli' referans alırız chapter 2 The Semantics of Constructors

+0

Referansınız var mı? –

+0

Artık yapının önemsiz bir şekilde kopyalanabileceğini fark ettim. –

+0

@LorenzoPistone: yapının POD tipi olması gerekir. –