Вы неправильно читаете cppreference (и стандарт). Ни в одном документе не прописаны «требования», как вы. Они оба проводят различие между требованиями (когда функция участвует в разрешении перегрузки) и поведением (что делает функция, когда она выполняется). Ваш список объединяет два.
Например, ваш элемент 1 является частью поведения функции; он говорит, что функция должна конвертировать t
в string_view
. Если вы уберете пункт 1, то функция не сделает этого, и поэтому она станет неработоспособной.
Вопрос, который вы, вероятно, задаете, заключается в том, почему бы просто не иметь перегрузку, которая принимает string_view
как параметр вместо шаблона с кучей лишних вещей в нем?
Причина этого изложена в том, что вы указали. Поскольку assign
и аналогичные функции уже имеют перегрузку, которая принимает const char*
, прямая передача строкового литерала создаст неоднозначность между перегрузкой const char*
и перегрузкой string_view
, поскольку обе они неявно преобразуются из строкового литерала.
Бит «эта перегрузка участвует только в разрешении перегрузки, если» - это то, что предотвращает возникновение этой неоднозначности. Вот почему в нем прямо говорится, что T
не может быть преобразовано в const CharT*
. Но принятие такого запрета требует, чтобы тип параметра, который принимает функция, не был string_view
; вместо этого он должен быть выведен в точке вызова из типа параметра. Таким образом, это должен быть некоторый тип параметра шаблона T
, чтобы можно было реализовать требование разрешения перегрузки.
И это означает, что реализация функции должна выполнить преобразование в string_view
.
Добавляет все символы из t как к добавлению (t.data (), t.size ()).
t
не может string_view
; требуется только, чтобы t
был конвертируемым в string_view
. Таким образом, t.data()
может не быть функцией, которую реализует t
.
Если вам нужен пример такого типа, это будет любой тип строки (кроме * 1046). *) который конвертируется в string_view
(и не конвертируется в const CharT*
). А поскольку string_view
является таким полезным типом строк в языке lingua-franca, многие пользовательские типы строк были преобразованы в string_view
.
.