2016-04-04 16 views
2

Bunu anlamakta zorlanıyorum.Noexcept etiketli bir işlev içinde neden bir istisna atılmasına izin verilir?

double compute(double x, double y) noexcept 
{ 
    if (y == 0) 
     throw std::domain_error("y is zero"); 
    return x/y; 
} 

bu clang (gcc kontrol etmedim) ince derler ama bana saçma görünüyor. Bir derleyici neden noexcept işlevinin throw ifadesi içermesine izin verir?

+0

Deneyin .......... –

+0

['std :: terminate'] (http://cdn.theatlantic.com/assets/media/img/mt/2014/12/term/lead_large .jpg) – user657267

+0

Üzgünüz, başlık yanıltıcı. Asıl soru şudur: "Neden bir derleyici noexcept işlevinin bir throw ifadesi içermesine izin verir?" – tunnuz

cevap

2

Ne olacağı özel durumunuz bunun gerçekleşmesine izin vermediğinden std::terminate() tetiklenir (bkz. [except.spec/9]).

Neden izin verildiğine bağlı olarak, şartnameyi ihlal eden herhangi bir şey olup olmadığını kapsamlı bir şekilde kontrol etmek mümkün değildir. Şunlar gibi bir şey düşünün:

double f(double); 
double compute(double x, double y) noexcept 
{ 
    return x/f(y); 
} 

f atabilir misiniz? Söyleyemem.

2

Atmak istemediğini iddia eden bir işlev aslında atacaktır.
işlevi işlevi atıyorsa, terminate, bu nedenle çalışma zamanında atmama sözünü zorlar. Bir fonksiyon vaat ediyor arayanların onlar özel başa gerek asla olmayan atma fonksiyonu atmak olmayacağını belirterek

// The compiler does not check the `noexcept` specification at compile time. 
void f() noexcept // Promises to not throw any exception 
{ 
    throw runtime_error("error"); // Violates the exception specification 
} 

.

Bu işlev atmaz veya tüm program sonlandırılır.

İlgili konular