В Microsoft реализации библиотеки поддержки рекомендаций я вижу следующий фрагмент кода:
template<class T>
class not_null {
...
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>
constexpr explicit not_null(U&& u) : ptr_(std::forward<U>(u)) {
Expects(ptr_ != nullptr);
}
...
constexpr T get() const {
Ensures(ptr_);
return ptr_;
}
...
T ptr_;
}
Все конструкторы gsl::not_null
, которые принимают, возможно, указатели, проверяют, что эти указатели не равны NULL, но мы по-прежнему проверяем сохраненное значение указателя (ptr_
) и NULL при каждом разыменовании. Почему у нас есть эта проверка, учитывая, что в C ++ мы обычно не платим за то, что нам не нужно?
UP : обеспечивает реализацию следующим образом (с флагами по умолчанию):
#define GSL_LIKELY(x) (!!(x))
...
#define GSL_CONTRACT_CHECK(type, cond) \
(GSL_LIKELY(cond) ? static_cast<void>(0) : gsl::details::terminate())
...
#define Ensures(cond) GSL_CONTRACT_CHECK("Postcondition", cond)