此代码不会打印任何内容,但也不会产生错误。为什么呢?
string s = "test";
cout << s[5];
答案 0 :(得分:4)
operator[]
std::string
为documented to not do any bounds checking:
返回对指定位置pos处的字符的引用。没有进行边界检查。
要从带有边界检查的字符串中读取,请使用at():
返回对指定位置pos处的字符的引用。执行边界检查,无效访问时将抛出std :: out_of_range类型的异常。
答案 1 :(得分:1)
该标准规定您正在做的是未定义的行为。根据{{1}}:
<强>
C++11 21.4.5 basic_string element access
强>
的const_reference operator[](size_type pos) const;
强>需要:
reference operator[](size_type pos);
返回:
pos <= size()
如果*(begin() + pos)
,则返回对值为pos < size()
的{{1}}类型的对象的引用,其中修改对象会导致未定义的行为。< / p>投掷:没什么。
复杂性:恒定时间。
在您的情况下,charT
不小于charT()
,因此您可能会认为&#34;否则&#34; &#34;返回&#34;部分通常适用,因此您只需获得pos
的实例,但您不允许修改。
然而,因为您实际上违反了&#34;要求&#34;条款,size()
大于而不是charT
,所有投注都已关闭。标准的控制部分是图书馆范围:
pos
违反函数中指定的先决条件&#39;要求:&#39;段落导致未定义的行为,除非函数的&#39;抛出:&#39; paragraph指定在违反前提条件时抛出异常。
如果需要边界检查,请使用size()
代替17.6.4.11 Requires paragraph [res.on.required]
:
<强>
at()
强>
的operator[]
强>需要:
const_reference at(size_type pos) const;
如果
,则抛出reference at(size_type pos);
pos < size()
返回:
out_of_range