c++ - 在 C++11 及更高版本中,std::string::operator[] 是否进行边界检查?

标签 c++ string c++11 c++14 arrayaccess

我见过很多次std::string::operator[]不做任何边界检查。偶What is the difference between string::at and string::operator[]? ,在 2013 年问,答案说 operator[]不做任何边界检查。

我的问题是,如果我查看 [string.access] 中的标准(在本例中为 draft N3797),我们有

const_reference operator[](size_type pos) const;
reference operator[](size_type pos);
  1. Requires: pos <= size().
  2. Returns: *(begin() + pos) if pos < size(). Otherwise, returns a reference to an object of type charT with value charT(), where modifying the object leads to undefined behavior.
  3. Throws: Nothing.
  4. Complexity: constant time.

这让我相信 operator[]必须进行某种边界检查以确定它是否需要返回字符串的元素或默认 charT .这个假设正确吗?operator[]现在需要做边界检查吗?

最佳答案

措辞有些困惑,但如果你仔细研究它,你会发现它实际上非常精确。

上面写着:

  • 前提条件是 [] 的参数要么是 = n 要么是 <n
  • 假设前提条件满足:
    • 如果是 <n,那么你会得到你想要的字符。
    • “否则”(即如果它是 n)然后你会得到 charT()(即空字符)。

但是当你打破前提条件时没有定义规则,可以通过实际存储 charT() 在位置 n.

因此实现不需要执行任何边界检查……而普通的则不需要。

关于c++ - 在 C++11 及更高版本中,std::string::operator[] 是否进行边界检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38506473/

相关文章:

c++ - 在 C++11 中,如何在 vector 上调用 std::max?

c++ - 我如何让 Anjuta 突出显示我的构建系统 (waf) 产生的错误/行?

用于字符串修改的 Python 代码无法正常工作

c# - 在保留 P、BR、UL、OL 的同时将 HTML 转换为纯文本?

c++ - 如何将 shared_ptr 作为参数传递给可变对象?

c++ - 当 T 是 std::pair<std::hash 也支持的两种更简单的类型> 时,std::hash<T> 应该工作吗?

c++ - 通过函数返回枚举

c++ - 有使用英特尔线程构建模块的经验吗?

c++ - 在 vs2008 SP1 中禁用检查迭代器时出现问题 (_HAS_ITERATOR_DEBUGGING=0)

Java:如何比较两个字符串以获得它们不同的部分?