2012-04-11 20 views
11

Bana açık olmayan bazı özel durumlar sorunuyla karşılaştım. C++ 'da, bir nesne atıldığında, ilk olarak geçici bir nesneye kopyalanır ve geçici nesne daha sonra yakalama koduna geçirilir. Kopya, nesnenin sınıf kopya oluşturucusunun kullanımını içerir. AFAIK, bu, bir sınıfın özel bir kopya yapıcısına sahip olması durumunda, bir istisna olarak kullanılamayacağı anlamına gelir. Ancak, VS2010'da, aşağıdaki kod derler ve çalışır:Özel kopya oluşturuculara sahip nesneler atılabilir mi?

class Except 
{ 
    Except(const Except& other) { i = 2; } 
public: 
    int i; 
    Except() : i(1) {} 
}; 

int main() 
{ 
    try 
    { 
     Except ex1; 
     throw ex1;   // private copy constructor is invoked 
    } 
    catch (Except& ex2) 
    { 
     assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2 
    } 
    return 0; 
} 

Bu yasal mı?

+0

deneyin elided bile ve çağrıların sırasına bakın, belki işler yaptığınızı düşündüğünüz gibi çalışmaz. – selalerer

+1

VS2010 ile aynı davranışı alıyorum ama gcc v4.3.4 ile [burada] (http://ideone.com/RlOjl) başarısız. – hmjd

+0

Geçici nesnenin ne oluşturulduğu ve kopyalamanın en iyi duruma getirilmiş olması olabilir. Dönüş değeri optimizasyonuna benzer. –

cevap

13

Yasal değil. Standart

geçici nesnenin kullanımı geçici nesne (12.2) kullanımıyla ilişkili kurucular ve yıkıcılar yürütülmesi hariç programının anlamı değiştirmeden elimine edilebilir 15.1/5

, Daha sonra işleyicideki istisna, throw ifadesinin argümanı ile doğrudan başlatılabilir. Atılan nesne bir sınıf nesnesi olduğunda ve geçici kopyasını başlatmak için kullanılan kopya kurucusuna erişilemiyorsa, program hatalı biçimlendirilmişse ( geçici nesne başka şekilde ortadan kaldırılmış olsa bile). Benzer şekilde, bu nesne için destructor erişilemiyorsa, program ill-biçimlidir (geçici nesne aksi halde elimine edilmiş olabilir).

+0

Vay canına inanılmaz, bunun olabileceğini asla tahmin edemezdim. teşekkür ederim. – petric

2

Hayır, öyle değil.

15.1.5 atılan nesnesi bir sınıf nesnesi, kopyalama/taşıma yapıcı ve yıkıcı erişilebilir olacak, kopyalama/taşıma işlemi baskılar veya hata ayıklama ekleyerek

İlgili konular