Determinar si un constructor de una clase base abstracta no es excepto?
En C ++ 11 y versiones posteriores, cómo determinar si un constructor de una clase base abstracta esnoexcept
? Los siguientes métodos no funcionan:
#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()), "");
Un uso simple para esto sería:
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;
};
¿Alguna idea sobre cómo archivar esto o si es posible sin modificar la clase base abstracta?
PD: Cualquier referencia a informes de defectos ISO C ++ o trabajos en progreso también es bienvenida.
EDITAR: Como se señaló dos veces, por defecto elDerived
constructores con= default
hacenoexcept
siendo heredado Pero esto no resuelve el problema para el caso general.