从C++ 11开始考虑以下内容:
[C++11: 21.4.5]:basic_string元素访问[string.access]Run Code Online (Sandbox Code Playgroud)const_reference operator[](size_type pos) const; reference operator[](size_type pos);1 要求:
pos <= size().2 返回:
*(begin() + pos)ifpos < size(),否则引用T具有值的类型的对象charT(); 参考值不得修改.3 投掷:没什么.
4 复杂性:恒定时间.
这意味着:
pos == size()案件中的参考值不得修改,或op[]即使对于非const过载,也不应修改返回的引用值.第二种情况似乎完全荒谬,但我认为这是措辞最强烈暗示的内容.
我们可以修改我们得到的内容std::string::op[]吗?这不是一个含糊不清的措辞吗?
Dav*_*eas 12
引用意味着operator[]( size() )即使值已明确定义,也无法修改返回值.也就是说,即使通过非const重载,也不得修改字符串中的NUL终止符.
这基本上是你的第一个选择:即pos >= size(),但由于要求pos <= size(),该条件唯一可能的值是pos == size().
该子句的实际英文描述可能含糊不清(至少对我而言),但是附录C,特别是C.2.11处理字符串库中语义的变化,并没有提到这种变化 - 会破坏用户代码.在C++ 03中,"引用值不应被修改"位不存在且没有歧义.C.2.11中缺少提及不是规范性的,但可以用作暗示,当他们编写标准时,无意改变这种特定行为.