如果访问了错误的字符串索引,c++不会抛出错误

c++ does not throw error if accessing wrong index of string

本文关键字:错误 c++ 出错 索引 访问 字符串 如果      更新时间:2023-10-16

我有下面的代码:

string s = "haha";
cout << s << endl; //haha
cout << s.length() << endl; //4
cout << (s[25] == 'h' ? "is h" : "is not h") << endl; //is not h
cout << s[0] << endl; // h
cout << s[25] << endl; // nothing...blank

似乎指向任何索引,即使它超出了范围也不会抛出任何错误…原因是什么?

效率。可以使用at函数进行边界检查。

string提供绑定签入函数,如果下标无效则抛出异常。

std::string::operator[]文档说:

char& operator[] (size_t pos);
<标题>异常安全

如果pos不大于字符串长度,函数永远不会抛出异常(no-throw保证)。

在STL字符串文档中,这里关于运算符[]的部分提到(它是用于字符串s,在位置pos, s[pos])

异常安全的如果pos不大于字符串长度,该函数永远不会抛出>异常(无抛出保证)。否则,将导致未定义行为。

有趣的一点是:

如果pos等于字符串长度,函数返回对>null字符('')的引用。(c++ 98)

如果pos等于字符串长度,函数返回对字符串最后一个字符后面的空字符>的引用,该>不能被修改。(c++ 11)

but成员函数";正如文件中所说:

强保证:如果抛出异常,>string中没有变化。

如果pos不小于字符串长度,则抛出out_of_range异常。