Одна из причин, по которой вы можете сделать это, вероятно, заключается в том, что иногда вы можете получить указатель / умный указатель и захотеть сравнить его с gsl::not_null
и / или передать gsl::not_null
в шаблонной функции (что определенно не в курсе того, что предлагает gsl::not_null
):
template<class Lhs, class Rhs>
bool hasSameValue(Lhs lhs, Rhs rhs){
if(lhs == nullptr || rhs == nullptr)
return lhs == rhs;
return *lhs == *rhs;
}
gsl::not_null<int*> ptr = /* [...] */;
shared_ptr<int> sptr = /* [...] */;
hasSameValue(ptr, sptr);
Если вы все еще хотите запретить проверки w / nullptr
:
bool operator==(std::nullptr_t nptr) = delete;
bool operator!=(std::nullptr_t nptr) = delete;
Достаточно пометить их как удаленные. Обратите внимание, что gsl::not_null
не должен наследовать от класса, который их определяет, чтобы сделать это. Если он наследует от класса, который его определяет, просто сгенерируйте исключение (даже если это будет только ошибка времени выполнения).