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

2024-03-14

请考虑 C++11 中的以下内容:

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

const_reference operator[](size_type pos) const;
reference       operator[](size_type pos);

1     Requires: pos <= size().

2     Returns: *(begin() + pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified.

3     Throws: Nothing.

4     Complexity: constant time.

这意味着:

  • 中的参考值pos == size()案件不得修改,或
  • In any情况下,返回的引用值op[]不得修改,即使对于非const超载。

第二种情况看起来完全荒谬,但我认为这是措辞最强烈的暗示。

我们可以修改我们从中得到的内容吗std::string::op[], 或不?这不是相当含糊的措辞吗?


报价的意思是你不能修改返回的operator[]( size() ),即使该值定义明确。也就是说,即使通过非常量重载,也不能修改字符串中的 NUL 终止符。

这基本上是您的第一个选择:即pos >= size(),但是由于要求pos <= size()该条件的唯一可能值是pos == size().

该子句的实际英文描述可能不明确(至少对我来说),但附录 C,特别是 C.2.11 涉及字符串库中语义的更改,并且没有提及此更改 - 这会破坏用户代码。在 C++03 中“参考值不得修改”bit 不存在并且没有歧义。 C.2.11 中没有提及并不是规范性的,但可以作为一个暗示,表明他们在编写标准时无意改变这种特定行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改 std::string::op[] 的结果合法吗? 的相关文章

随机推荐