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.7
is_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).
Ve Andy Prowl'un 1000+ upvotes ile nasıl bir cevap yazdığı budur. –
@ 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;) –