gsl :: not_null <T *> против std :: reference_wrapper <T> против T &
Основные положения C ++ был представлен недавно (поздравляю!), и я обеспокоенgsl::not_null
тип. Как указано вI.12. Объявить указатель, который не должен быть нулевым, какnot_null
:
Чтобы избежать разыменования ошибок nullptr. Чтобы повысить производительность, избегая избыточных проверок на nullptr.
...
Указав намерение в источнике, разработчики и инструменты могут обеспечить лучшую диагностику, такую как обнаружение некоторых классов ошибок посредством статического анализа, и выполнить оптимизацию, такую как удаление ветвей и нулевые тесты.
Намерение ясно. Тем не менее, у нас уже есть языковая функция для этого. Указатели, которые не могут быть нулевыми, называются ссылками. И хотя ссылки не могут быть восстановлены после их создания, эта проблема решаетсяstd::reference_wrapper
.
Основное различие междуgsl::not_null
а такжеstd::reference_wrapper
Я вижу в том, что последний может использоваться только вместо указателей, в то время как первый работает на что угодноnullptr
присваивается (цитата изF.17: используйте not_null, чтобы указать, что «null» не является допустимым значением):
not_null
не только для встроенных указателей. Это работает дляarray_view
, string_view
, unique_ptr
, shared_ptr
и другие подобные указателю типы.
Я представляю таблицу сравнения функций, как показано ниже:
T&
:
nullptr
? -даRebindable? -нетМожет быть использован вместо чего-то, кроме указателей? -нетstd::reference_wrapper<T>
:
nullptr
? -даRebindable? -даМожет быть использован вместо чего-то, кроме указателей? -нетgsl::not_null<T*>
:
nullptr
? -даRebindable? -даМожет быть использован вместо чего-то, кроме указателей? -даТеперь вот вопросы, наконец:
Правильно ли мое понимание различий между этими понятиями?Означает ли это, чтоstd::reference_wrapper
теперь бесполезно?PS Я создал тегиcpp-core-guidelines
а такжеguideline-support-library
на это я надеюсь правильно.