在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_type是std::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++ …Run Code Online (Sandbox Code Playgroud)