2013-06-18 15 views
16

aşağıdaki programı düşünün noexcept (doğru) olduğunu düşünür:gr ++ 4.8.1 istisna şartname ile açıkça ilan yıkıcı daima

g++-4.8.1 ile

#include <type_traits> 

struct Thrower 
{ 
    ~Thrower() noexcept(false) { throw 1; } 
}; 

struct Implicit 
{ 
    Thrower t; 
}; 
static_assert(!std::is_nothrow_destructible<Implicit>::value, "Implicit"); 

struct Explicit 
{ 
    ~Explicit() {} 

    Thrower t; 
}; 
static_assert(!std::is_nothrow_destructible<Explicit>::value, "Explicit"); 
, statik bir onaylama işlemi hatası Explicit üzerinde var - ~Explicit()'un noexcept olduğunu düşünmek görünüyor. Bu benim beklentilerimle uyuşmuyor. §12.4.3 göre:

bir istisna-şartname olmayan bir yıkıcı bir bildirim örtülü örtük bir beyanı

komik bir şey aynı durum belirtimi olarak kabul olduğunu Burada, Implicit'un kontrolünün §15.4.14 (§12.4.7) 'e göre yorumlanmasından dolayı olduğu görülmektedir. f bir ... Yıkıcı ise

... ... o örtük istisna özellikli belirtir ... doğrudan çağırır her fonksiyon hiçbir istisna izin verirse f durum belirtimi noexcept(true) sahiptir var.

g++-4.7is_nothrow_destructable, ben 4.7 içinde davranışını kontrol için kendi yazdığı yoksundur. Program mükemmel bir şekilde derlenmiş gibi görünüyor. Neden g++-4.8.1 istisna şartname ile açıkça ilan yıkıcı daima noexcept(true) olduğunu düşünüyor:; DR

template <typename T> 
struct is_nothrow_destructible 
{ 
    static constexpr bool value = noexcept(std::declval<T>().~T()); 
}; 

TL: Ben bunun için doğru tamamen yanlış ve benim karışıklık kaynağı için rezerve?


Güncelleme: 57645: Bu konuda bir hata açtı. Bu soruna gerçekten ihtiyacınız varsa, yıkıcıya bir istisna belirtimi ekleyebilirsiniz (örnekteki Thrower'daki gibi).

+0

Ve Andy Prowl'un 1000+ upvotes ile nasıl bir cevap yazdığı budur. –

+0

@ H2CO3: lol, hayır, ben sadece bu bir derleyici hata olduğunu düşünüyorum ve bu konuda ilgili herhangi bir şey söylemek için sıfır şansı var;) –

cevap

7

TL; DR: Neden g ++ - 4.8.1 istisna şartname ile açıkça ilan yıkıcı daima noexcept(true) olduğunu düşünüyorum?

Bir hata var mı?

Standardın yorumlamanız doğrudur ve Clang doğru şekilde uygular (savruk yanmaz).

f doğrudan çağırır her fonksiyon hiçbir istisna verir eğer durum belirtimi noexcept(true) sahiptir.gövde içinde ayrılmış herhangi bir otomatik nesne, sınıfı için bir yıkıcı yıkıcı gövdesini yürütme ve yok sonra

:

§12.4 [class.dtor] p8:

bir yıkıcı doğrudan tüm alt nesnelerin yıkıcı çağırır X, X'in doğrudan varyant olmayan statik olmayan veri elemanları [...] için yıkıcıları çağırır.

+2

Oh evet, lütfen bir hata raporu veriniz [GCC'nin bugtracker'ında] (http: // gcc. gnu.org/bugzilla/). – Xeo

+0

Derleyicinin yerine yanıldığımı umuyordum ... çok daha rahat bir şey. Üzerine bir hata açtım. –