修改std :: string :: op []的结果是否合法?

Lig*_*ica 23 c++ string std

从C++ 11开始考虑以下内容:

[C++11: 21.4.5]: basic_string 元素访问[string.access]

const_reference operator[](size_type pos) const;
reference       operator[](size_type pos);
Run Code Online (Sandbox Code Playgroud)

1     要求: pos <= size().

2     返回: *(begin() + pos) if pos < 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中缺少提及不是规范性的,但可以用作暗示,当他们编写标准时,无意改变这种特定行为.

  • @ TomalakGeret'kal我提供了我的解释,以及语义中断将在附录C中显示的附加位,特别是C.2.11,以及语义中的其他两个更改.在该部分中没有提到可以用作暗示C++ 03中的语义被维护,并且C++ 03对通过`operator []`改变值没有任何限制.至于问题*我确定吗?*,是的,我确定. (2认同)