<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 530: Must elements of a string be contiguous?</title>
<meta property="og:title" content="Issue 530: Must elements of a string be contiguous?">
<meta property="og:description" content="C++ library issue. Status: CD1">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue530.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#CD1">CD1</a> status.</em></p>
<h3 id="530"><a href="lwg-defects.html#530">530</a>. Must elements of a string be contiguous?</h3>
<p><b>Section:</b> 27.4.3 <a href="https://wg21.link/basic.string">[basic.string]</a> <b>Status:</b> <a href="lwg-active.html#CD1">CD1</a>
 <b>Submitter:</b> Matt Austern <b>Opened:</b> 2005-11-15 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View other</b> <a href="lwg-index-open.html#basic.string">active issues</a> in [basic.string].</p>
<p><b>View all other</b> <a href="lwg-index.html#basic.string">issues</a> in [basic.string].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#CD1">CD1</a> status.</p>
<p><b>Discussion:</b></p>
<p>Issue <a href="lwg-defects.html#69" title="Must elements of a vector be contiguous? (Status: TC1)">69</a><sup><a href="https://cplusplus.github.io/LWG/issue69" title="Latest snapshot">(i)</a></sup>, which was incorporated into C++03, mandated
   that the elements of a vector must be stored in contiguous memory.
   Should the same also apply to <code>basic_string</code>?</p>

<p>We almost require contiguity already. Clause 23.4.7 <a href="https://wg21.link/multiset">[multiset]</a>
  defines <code>operator[]</code> as <code>data()[pos]</code>. What's missing
  is a similar guarantee if we access the string's elements via the
  iterator interface.</p>

<p>Given the existence of <code>data()</code>, and the definition of
  <code>operator[]</code> and <code>at</code> in terms of <code>data</code>,
  I don't believe it's possible to write a useful and standard-
  conforming <code>basic_string</code> that isn't contiguous. I'm not
  aware of any non-contiguous implementation. We should just require
  it.
</p>


<p id="res-530"><b>Proposed resolution:</b></p>
<p>Add the following text to the end of 27.4.3 <a href="https://wg21.link/basic.string">[basic.string]</a>,
paragraph 2. </p>

<blockquote>
  <p>The characters in a string are stored contiguously, meaning that if
  <code>s</code> is a <code>basic_string&lt;charT, Allocator&gt;</code>, then
  it obeys the identity
  <code>&amp;*(s.begin() + n) == &amp;*s.begin() + n</code>
  for all <code>0 &lt;= n &lt; s.size()</code>.
  </p>
</blockquote>


<p><b>Rationale:</b></p>
<p>
Not standardizing this existing practice does not give implementors more
freedom.  We thought it might a decade ago.  But the vendors have spoken
both with their implementations, and with their voice at the LWG
meetings.  The implementations are going to be contiguous no matter what
the standard says.  So the standard might as well give string clients
more design choices.
</p>





</body>
</html>
