При создании версии 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_;
По сути, появляются две реализации быть неправым, но вопрос в том, какой из них правильный?