Что такое `std :: string_view :: max_size ()`? - PullRequest
4 голосов
/ 23 февраля 2020

При создании версии std::basic_string_view для частного проекта (выбор сделан для меня: C ++ 11; нет boost :: позволено; с щепоткой NIH, поэтому тоже нет GSL) я пришел к реализации std::basic_string_view::max_size() для которого стандарт (n4820 21.4.2.3 Capacity) просто гласит:

Возвращает: максимально возможное количество объектов типа char, на которые может ссылаться basic_string_view.

Логически, это будет максимальное число, которое std::basic_string_view::size_type может представлять: std::numeric_limits<std::basic_string_view::size_type>::max(), который выходит на 18446744073709551615 на моей платформе, где size_type равно std::size_t.

Я решил, что, так как я хочу чтобы быть совместимым со стандартными библиотеками, я должен убедиться, что получаю тот же номер, что и другие реализации. Вот где я заблудился.

Учитывая, что у меня есть auto max_size = string_view{"foo"}.max_size(), я получаю следующие результаты:

+--------------+--------------------------+
| Library      | Result                   |
+--------------+--------------------------+
| libstdc++    | 4611686018427387899      |
| libc++       | 18446744073709551615     |
| boost 1.72.0 | 3                        |
+--------------+--------------------------+

Если моя интерпретация верна, то это означает, что libc ++ и я согласен на то, что значение должно быть. Я чувствую, что повышение совершенно неверно, поскольку спецификация для max_size должна возвращать максимально возможное число, к которому a , а не это , string_view. Однако, как отмечено в комментариях, boost :: string_view предшествует стандарту, и поэтому нечестно называть его «совершенно неправильным». Далее, глядя на реализации всех трех библиотек, libc ++ возвращает

numeric_limits<size_type>::max();

libstdc ++ возвращает

(npos - sizeof(size_type) - sizeof(void*)) / sizeof(value_type) / 4;

и Boost возвращает:

len_;

По сути, появляются две реализации быть неправым, но вопрос в том, какой из них правильный?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...