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ı?
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
VS2010 ile aynı davranışı alıyorum ama gcc v4.3.4 ile [burada] (http://ideone.com/RlOjl) başarısız. – hmjd
Geçici nesnenin ne oluşturulduğu ve kopyalamanın en iyi duruma getirilmiş olması olabilir. Dönüş değeri optimizasyonuna benzer. –