Это C ++.В мире шаблонного метапрограммирования возможно практически все.Если мы сделаем NoCopy
базу CRTP, мы можем добавить статические утверждения в ее деструктор.
template<class C>
struct NoCopy {
NoCopy(){}
NoCopy(const NoCopy&) = delete;
NoCopy& operator=(const NoCopy&) = delete;
~NoCopy() noexcept {
static_assert(std::is_base_of<NoCopy, C>::value, "CRTP not observed");
static_assert(!std::is_copy_constructible<C>::value, "A non-copyable copyable class? Really?");
}
};
Вот ваш код, адаптированный для живого примера .
Это не без цены, так как теперь класс не является тривиально разрушаемым, и как таковой ни один класс не будет производным от него.Независимо от того, является ли это приемлемым, зависит только от вас.
При дальнейшем рассмотрении, если вы предоставите только один способ инициализации вашего класса, тогда конструктор по умолчанию имеет , на который можно сослатьсяи позвонил.Таким образом, статическое утверждение можно переместить туда, и тип снова становится тривиально разрушаемым:
template<class C>
struct NoCopy {
NoCopy() noexcept {
static_assert(std::is_base_of<NoCopy, C>::value, "CRTP not observed");
static_assert(!std::is_copy_constructible<C>::value, "A non-copyable copyable class? Really?");
}
NoCopy(const NoCopy&) = delete;
NoCopy& operator=(const NoCopy&) = delete;
};
Статическое утверждение срабатывает точно так же, как этот живой пример показывает.