Я полностью понимаю, почему эта не может работать:
class Base {};
class A;
static_assert(std::is_base_of<Base, A>::value, "");
Потому что нет никакой информации об иерархии классов, но... Почему не может работать следующее?
class Base {};
class A : public Base {
static_assert(std::is_base_of<Base, A>::value, "");
};
(produce: an undefined class is not allowed as an argument to compiler intrinsic type trait)
Тип "A" по-прежнему не завершен в строке с static_assert (согласно определению этого понятия). Однако - компилятор уже знает "иерархию классов" и может предоставить ответ для этого.
Конечно - этот static_assert может быть перемещен в деструктор или что-то еще, чтобы исправить эту проблему, но бывают ситуации, когда это невозможно сделать, например:
class Base {};
template<typename T>
struct type_of {
static_assert(std::is_base_of<Base, T>::value, "T is not derived from Base");
using type = int; //* Some normal type in real use
};
class A : public Base {
public:
type_of<A>::type foo(); // Will not compile
};
Если это не разрешено?