在C++ 11及更高版本中,如何確定抽象基類的構造函數是否爲noexcept
?下面的方法不起作用:確定抽象基類的構造函數是否爲noexcept?
#include <new>
#include <type_traits>
#include <utility>
struct Base { Base() noexcept; virtual int f() = 0; };
// static assertion fails, because !std::is_constructible<Base>::value:
static_assert(std::is_nothrow_constructible<Base>::value, "");
// static assertion fails, because !std::is_constructible<Base>::value:
static_assert(std::is_nothrow_default_constructible<Base>::value, "");
// invalid cast to abstract class type 'Base':
static_assert(noexcept(Base()), "");
// invalid new-expression of abstract class type 'Base'
static_assert(noexcept(new (std::declval<void *>()) Base()), "");
// cannot call constructor 'Base::Base' directly:
static_assert(noexcept(Base::Base()), "");
// invalid use of 'Base::Base':
static_assert(noexcept(std::declval<Base &>().Base()), "");
爲一個簡單的用途是:
int g() noexcept;
struct Derived: Base {
template <typename ... Args>
Derived(Args && ... args)
noexcept(noexcept(Base(std::forward<Args>(args)...)))
: Base(std::forward<Args>(args)...)
, m_f(g())
{}
int f() override;
int m_f;
};
有關如何archieve這還是有可能的任何想法都無需修改的抽象基類? PS:所有對ISO C++缺陷報告或正在進行的工作的引用也是受歡迎的。
編輯:正如指出的兩次,= default
使得noexcept
拖欠Derived
構造繼承。但這並不能解決一般情況下的問題。
如果你知道抽象方法,你可以像[this]一樣做(http://coliru.stacked-crooked.com/a/99ee522df4a1c7c7)。如果你想要一個完全通用的解決方案,我認爲你運氣不好 – sp2danny