我对析构函数和 noexcept
有些困惑。我的理解是,在 C++11 中,任何析构函数,包括用户定义的,都会隐式地被视为 noexcept(true)
,即使我们从其中 throw
。如果有人出于某种原因希望它不是这样,就必须明确指定 noexcept(false)
。
然而,我发现情况恰好相反 - 在 GCC 4.7.2 中,无论类和析构函数多么原始,用户定义的析构函数都会隐式地被视为 noexcept(false)
。我错过了什么?用户定义的析构函数有什么隐藏的陷阱吗?
我对析构函数和 noexcept
有些困惑。我的理解是,在 C++11 中,任何析构函数,包括用户定义的,都会隐式地被视为 noexcept(true)
,即使我们从其中 throw
。如果有人出于某种原因希望它不是这样,就必须明确指定 noexcept(false)
。
然而,我发现情况恰好相反 - 在 GCC 4.7.2 中,无论类和析构函数多么原始,用户定义的析构函数都会隐式地被视为 noexcept(false)
。我错过了什么?用户定义的析构函数有什么隐藏的陷阱吗?
struct X
{
~X() { };
};
int main()
{
X x;
// This will not fire even in GCC 4.7.2 if the destructor is
// explicitly marked as noexcept(true)
static_assert(noexcept(x.~X()), "Ouch!");
}