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 на это я надеюсь правильно.

Ответы на вопрос(1)

Ваш ответ на вопрос