当字符串下标超出范围时,不会抛出异常

时间:2015-08-10 02:18:52

标签: c++ string

此代码不会打印任何内容,但也不会产生错误。为什么呢?

string s = "test";
cout << s[5];

2 个答案:

答案 0 :(得分:4)

operator[] std::stringdocumented 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