Ermitteln, ob ein Konstruktor einer abstrakten Basisklasse noexcept ist?

n C ++ 11 und höher, wie Sie bestimmen, ob ein Konstruktor einer abstrakten Basisklasse @ inoexcept? Die folgenden Methoden funktionieren nicht:

#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()), "");

ine einfache Verwendung dafür wäre:

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;
};

Haben Sie eine Idee, wie Sie dies archivieren können oder ob dies überhaupt möglich ist, ohne die abstrakte Basisklasse zu ändern?

PS: Verweise auf ISO C ++ - Fehlerberichte oder laufende Arbeiten sind ebenfalls willkommen.

BEARBEITEN Wie bereits zweimal erwähnt, wird standardmäßig dasDerived Konstruktoren mit= default machtnoexcept wird geerbt. Dies löst jedoch nicht das Problem für den allgemeinen Fall.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage