Atma ve yakalama atları nasıl çalışır?


14

Bu kodla:

int main()
{
    try
    {
        throw -1;
    }
    catch (int& x)
    {
        std::cerr << "We caught an int exception with value: " << x << std::endl;
    }
    std::cout << "Continuing on our merry way." << std::endl;

    return 0;
}

Sahibiz:

/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1

Nasıl yok catchblok okundu -1olarak int&? Sabit olmayan bir değer referansına değer atayamadık.

İkinci std::coutifade neden ilk std::cerrifadeden önce yürütülüyor ?


2
Bunun tam olarak elde ettiğiniz çıktı olduğundan emin misiniz? Önce We caught an int exception with value: -1satır yazdırılmalıdır.
HolyBlackCat

1
@Scheff, Maalesef doğru, ilk çıkış yönlendirilir edilir error streamdeğil standard stream.
Ghasem Ramezani


2
@ FrançoisAndrieux İzin verilmesinin nedeni, farklı semantiklerin devam etmesidir. Genellikle bir geçici ile bunun ne olacağını bilmiyorsunuz, bu yüzden sadece geçici olanlara const referanslarına izin vermeye karar verildi. İstisnalar dışında, nesnenin ömrünü biliyoruz ve nesneyi değiştirmek ve daha yüksek bir içeriğe geri döndürmek isteyebiliriz. Bunu kolaylaştırmak için standart, sabit olmayan bir değer referansına bağlanmaya izin verir.
NathanOliver

1
@ FrançoisAndrieux throw, kendisine ilettiğiniz nesnenin bir kopyasını oluşturur (veya taşır). Referans bu kopyaya bağlanır. Kopyanın bir değer olduğu mantıklı.
HolyBlackCat

Yanıtlar:


10

Bu [atış hariç] / 3 nedeniyle sorun değil

Bir istisna fırlatıldığında, istisna nesnesi adı verilen geçici bir nesne kopyalanır ([dcl.init], [class.copy.ctor]). Geçici işleyiciyi belirten bir değer, eşleşen işleyicide bildirilen değişkeni başlatmak için kullanılır ([tutma kolu hariç)).

benimkini vurgula

Gördüğünüz gibi, geçici olmasına rağmen, derleyici bunu işleyiciyi başlatmak için bir değer olarak kabul eder. Bu nedenle, bir const referansına ihtiyacınız yoktur.


1
Ancak mesajların görünme sırası nedir?
Tomáš Zato - Monica'yı eski durumuna döndür

8

Gönderen bu throwreferans :

Diğer geçici nesnelerin aksine, istisna nesnesi catch yan tümcesi parametrelerini başlatırken bir lvalue argümanı olarak kabul edilir, bu nedenle lvalue referansı ile yakalanabilir, değiştirilebilir ve yeniden oluşturulabilir.

"Nesne" geçici olsa da, yine de bir değerdir ve referans olarak yakalayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.