什么是`std::string_view::max_size()`?

Dav*_*own 5 c++ c++11

std::basic_string_view为私人项目创建一个版本时(为我做出的选择:C++11;不允许 boost:: 允许;有一点 NIH,所以也没有 GSL)我开始实施std::basic_string_view::max_size()标准 (n4820 21.4.2.3容量)简单地说:

返回: basic_string_view 可以引用的最大可能数量的类似字符的对象。

从逻辑上讲,这将是std::basic_string_view::size_type可以表示的最大数字:std::numeric_limits<std::basic_string_view::size_type>::max()在我的平台上的 18446744073709551615 出现在哪里size_typestd::size_t

我想,既然我想与标准库兼容,我应该确保我达到与其他实现相同的数量。这是我迷路的地方。

鉴于我有一个auto max_size = string_view{"foo"}.max_size()那么我得到以下结果:

+--------------+--------------------------+
| Library      | Result                   |
+--------------+--------------------------+
| libstdc++    | 4611686018427387899      |
| libc++       | 18446744073709551615     |
| boost 1.72.0 | 3                        |
+--------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

如果我的解释是正确的,那么这意味着 libc++ 和我同意该值应该是什么。我觉得提升是完全错误的,因为规范max_size是返回最大可能数,不是这个string_view可以参考。然而,正如评论中所指出的, boost::string_view 早于标准,因此称其为“完全错误”是不公平的。此外,查看 libc++ 返回的所有三个库的实现

+--------------+--------------------------+
| Library      | Result                   |
+--------------+--------------------------+
| libstdc++    | 4611686018427387899      |
| libc++       | 18446744073709551615     |
| boost 1.72.0 | 3                        |
+--------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

libstdc++ 返回

numeric_limits<size_type>::max();
Run Code Online (Sandbox Code Playgroud)

并提高回报:

(npos - sizeof(size_type) - sizeof(void*)) / sizeof(value_type) / 4;
Run Code Online (Sandbox Code Playgroud)

基本上,两种实现似乎是错误的,但问题是:哪个是正确的?