<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Warum ist const_iterator::value_type nicht const?]]></title><description><![CDATA[<p>Hallo Experten,</p>
<p>mir ist gestern zum ersten Mal aufgefallen, dass der Typ</p>
<pre><code class="language-cpp">typedef einIterator Itr;
    std::iterator_traits&lt; Itr &gt;::value_type;
</code></pre>
<p>anscheinend nie const ist. Siehe dazu ein Ausschnitt aus dem Standard (Kapitel 24.3.1):</p>
<pre><code class="language-cpp">template&lt;class T&gt; struct iterator_traits&lt;const T*&gt; {
    typedef T value_type;  // und kein const T
    // ..
};
</code></pre>
<p>oder auch bei der Implementierung des std::vector&lt;&gt; in der Dinkumware-STL ist</p>
<pre><code class="language-cpp">std::iterator_traits&lt; std::vector&lt; T &gt;::const_iterator &gt;::value_type;
</code></pre>
<p>immer T aber nicht const T, wie ich ohne darüber nachzudenken erwartet hätte.</p>
<p>In meinem speziellen Fall hat dieser Umstand dann etliche Zeilen Extra-Template-Code gekostet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> , die ich mir lieber erspart hätte. Wenn man sich nämlich die <a href="http://www.boost.org/libs/utility/operators.htm#iterator" rel="nofollow">Iterator-Helper</a> in <a href="http://www.boost.org/libs/utility/operators.htm" rel="nofollow">boost.operators</a> anschaut, so ist der Default-Typ der reference eines Iterators immer value_type&amp;. Ist nun value_type aus einem (Const-)Iterator via std::iterator_traits&lt;&gt;::value_type generiert, so passt die Default-reference nicht.</p>
<p>Hat irgendjemand eine Idee, warum das so ist (Bug || Feature); oder sonst irgendeinen Kommentar dazu?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/174517/warum-ist-const_iterator-value_type-nicht-const</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 09:12:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174517.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Feb 2007 09:48:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 09:48:19 GMT]]></title><description><![CDATA[<p>Hallo Experten,</p>
<p>mir ist gestern zum ersten Mal aufgefallen, dass der Typ</p>
<pre><code class="language-cpp">typedef einIterator Itr;
    std::iterator_traits&lt; Itr &gt;::value_type;
</code></pre>
<p>anscheinend nie const ist. Siehe dazu ein Ausschnitt aus dem Standard (Kapitel 24.3.1):</p>
<pre><code class="language-cpp">template&lt;class T&gt; struct iterator_traits&lt;const T*&gt; {
    typedef T value_type;  // und kein const T
    // ..
};
</code></pre>
<p>oder auch bei der Implementierung des std::vector&lt;&gt; in der Dinkumware-STL ist</p>
<pre><code class="language-cpp">std::iterator_traits&lt; std::vector&lt; T &gt;::const_iterator &gt;::value_type;
</code></pre>
<p>immer T aber nicht const T, wie ich ohne darüber nachzudenken erwartet hätte.</p>
<p>In meinem speziellen Fall hat dieser Umstand dann etliche Zeilen Extra-Template-Code gekostet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> , die ich mir lieber erspart hätte. Wenn man sich nämlich die <a href="http://www.boost.org/libs/utility/operators.htm#iterator" rel="nofollow">Iterator-Helper</a> in <a href="http://www.boost.org/libs/utility/operators.htm" rel="nofollow">boost.operators</a> anschaut, so ist der Default-Typ der reference eines Iterators immer value_type&amp;. Ist nun value_type aus einem (Const-)Iterator via std::iterator_traits&lt;&gt;::value_type generiert, so passt die Default-reference nicht.</p>
<p>Hat irgendjemand eine Idee, warum das so ist (Bug || Feature); oder sonst irgendeinen Kommentar dazu?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236634</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 28 Feb 2007 09:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 09:58:22 GMT]]></title><description><![CDATA[<p>Der const-Iterator ist schlichtweg nur so gedacht, dass du den <strong>Container</strong> damit nicht strukturell beeinflusst. Das heißt zum Beispiel aus einer list nicht nen Knoten aushängst. Das ist eine wichtige Information, die durch den const_iterator auf diese Weise übermittelt wird. Warum ist diese Information wichtig? Weil du befürchten musst, dass jeder iterator ungültig wird, sobald du einen nicht-const iterator auf die Reise schickst (du machst es ja nicht immer so, dass du nen Iterator gleich komplett durchlaufen lässt und dann wegwirfst).</p>
<p>Auf der anderen Seite könnte man natürlich ab und zu auch sowas brauchen wie du gerade willst, einen element_const_iterator (und einen const_element_const_iterator <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236643</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 28 Feb 2007 09:58:22 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 10:11:12 GMT]]></title><description><![CDATA[<p>Optimizer schrieb:</p>
<blockquote>
<p>Der const-Iterator ist schlichtweg nur so gedacht, dass du den Container damit nicht strukturell beeinflusst.</p>
</blockquote>
<p>Hmh!? ich war bisher immer der Meinung, dass ein const_iterator ein Iterator ist, mit dem man primär das Element nicht verändern kann.<br />
Bei einer Manipulation am Container benötige ich immer Zugriff auf einen nicht-const-Container. Dass man dann natürlich nicht-const-iteratoren als Parameter mitgibt - z.B. bei erase - hielt ich bisher für einen Nebeneffekt, da die entsprechende begin()/end()-Methoden in diesem Fall auch nur nicht-const-iteratoren liefern.</p>
<p>Man kann mit einem Iterator allein nie den Container selbst verändern. Sondern nur das Element auf das der Iterator zeigt. D.h. für mich bezog sich das 'const' im Iterator immer das Element und nie auf den Container.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236653</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 28 Feb 2007 10:11:12 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 10:14:21 GMT]]></title><description><![CDATA[<p>Wäre der const_iterator wirklich const, würde denn sowas gehen?</p>
<pre><code>iter++
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1236659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236659</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Wed, 28 Feb 2007 10:14:21 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 10:24:26 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Optimizer schrieb:</p>
<blockquote>
<p>Der const-Iterator ist schlichtweg nur so gedacht, dass du den Container damit nicht strukturell beeinflusst.</p>
</blockquote>
<p>Hmh!? ich war bisher immer der Meinung, dass ein const_iterator ein Iterator ist, mit dem man primär das Element nicht verändern kann.<br />
Bei einer Manipulation am Container benötige ich immer Zugriff auf einen nicht-const-Container. Dass man dann natürlich nicht-const-iteratoren als Parameter mitgibt - z.B. bei erase - hielt ich bisher für einen Nebeneffekt, da die entsprechende begin()/end()-Methoden in diesem Fall auch nur nicht-const-iteratoren liefern.</p>
<p>Man kann mit einem Iterator allein nie den Container selbst verändern. Sondern nur das Element auf das der Iterator zeigt. D.h. für mich bezog sich das 'const' im Iterator immer das Element und nie auf den Container.</p>
<p>Gruß<br />
Werner</p>
</blockquote>
<p>Ja, aber man kann nen iterator zum Beispiel an eine erase-Methode übergeben und aber nicht nen const_iterator.<br />
Disclaimer: hab jetzt grad keinen C++ Compiler da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236669</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 28 Feb 2007 10:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 10:25:29 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Wäre der const_iterator wirklich const, würde denn sowas gehen?</p>
<pre><code>iter++
</code></pre>
</blockquote>
<p>Das ist ja noch mal was anderes. Das wäre das dritte mögliche const:<br />
(1) Container ist const<br />
(2) Inhalt ist const (im Kontext des Iterators)<br />
(3) Iterator ist const</p>
<pre><code class="language-cpp">const const_iterator_element_const
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236671</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 28 Feb 2007 10:25:29 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 10:51:50 GMT]]></title><description><![CDATA[<p>Optimizer schrieb:</p>
<blockquote>
<p>(2) Inhalt ist const (im Kontext des Iterators)</p>
</blockquote>
<p>Genau.. auf diesen Punkt bezog sich meine Frage. Wieso ist bei einem Iterator, bei dem auch der Inhalt const ist, der value_type nicht const?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236682</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 28 Feb 2007 10:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 10:56:07 GMT]]></title><description><![CDATA[<p>Ja, sind halt 3 mögliche const-Konzepte, und anscheinend fand man es nicht so wichtig, das 2te umzusetzen. Es ist aber wahrscheinlich auch eher so, dass du &quot;rohe&quot; Datenstrukturen wie ne verkette Liste nicht im public interface deiner Klasse hast. Wenn du einem Benutzer deiner Klasse Zugriff per Iterator gestatten willst, kannst du den Iterator ja ohne Probleme wrappen. Das heißt, du gibst nen eigenen Iterator-Typ zurück, der sich immer auf so nen list::const_iterator bezieht und auch noch T nur als const anbietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236685</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 28 Feb 2007 10:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 11:45:29 GMT]]></title><description><![CDATA[<p>Kann man denn bei nem const_iterator den Wert verändern? ich dachte nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236709</guid><dc:creator><![CDATA[Benutzersname]]></dc:creator><pubDate>Wed, 28 Feb 2007 11:45:29 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 12:01:28 GMT]]></title><description><![CDATA[<p>Wann wird denn diese Sache zum Problem?<br />
Hast Du vielleicht ein kleines Beispiel?</p>
<p>Auf jeden Fall fände ich es schlimmer, wenn der value_type const wäre.<br />
Beispiel:<br />
ich möchte eine Kopie eines Wertes von einem const_iterator erstellen.<br />
Was sollte diese funktion zurueckgeben?</p>
<pre><code class="language-cpp">template&lt;typename IterType&gt;
typename IterType::value_type getCopy(IterType constIterator)
{
}
</code></pre>
<p>Dann hab ich ne Konstante Kopie toll.<br />
Wenn ich das Glück habe und den Originaltypen kenne kann ich ihn ja jetzt nur mit hässlichem const_cast bearbeiten.<br />
Oder liege ich jetzt total daneben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236730</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Wed, 28 Feb 2007 12:01:28 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 12:10:36 GMT]]></title><description><![CDATA[<p>Benutzersname schrieb:</p>
<blockquote>
<p>Kann man denn bei nem const_iterator den Wert verändern? ich dachte nicht?</p>
</blockquote>
<p>Jo, ich habs gerade mal testen können. Man kann den Wert von T nicht veärndern. Worüber beschwert sich Werner dann überhaupt??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236738</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 28 Feb 2007 12:10:36 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 12:28:48 GMT]]></title><description><![CDATA[<p>Mal vom logischen gesehen: Die iterator_traits geben dir einige Hilfstypen in die Hand, damit du generische Algorithmen basteln kannst. Die beschreiben nicht das Verhalten IN deinem Iterator. Zum Beispiel:</p>
<pre><code class="language-cpp">template&lt;typename it&gt; 
typename iterator_traits&lt;it&gt;::value_type average(it st,it en)
{
  typedef typename iterator_traits&lt;it&gt;::value_type val_t;
  val_t sum=val_t();
  size_t count=0;

  for(;st!=en;++st)
  {
    sum+=*st;
    ++count;
  }
  return (count!=0)?sum:sum/count;
}
</code></pre>
<p>Für solche Konstruktionen benötigst du 'value_type' - wenn jetzt der const_iterator einen 'const T' angeben würde, hättest du das Problem, daß dieser Algorithmus nicht mehr mit einem konstanten Container funktionieren würde (oder müsstest einige zusätzliche Template-Basteleien auf dich nehmen, um das 'const' loswerden zu können). Im umgekehrten Fall (const_iterator::value_type ist nicht-const) hindert dich natürlich niemand daran, eine Konstante dieses Typs anzulegen.</p>
<p>(und den Versuch, die Daten hinter einem const_iterator zu beeinflussen, wird der Compiler dir in jedem Fall mit einem Fehler abblocken)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236753</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 28 Feb 2007 12:28:48 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 12:36:42 GMT]]></title><description><![CDATA[<p>Benutzersname schrieb:</p>
<blockquote>
<p>Kann man denn bei nem const_iterator den Wert verändern? ich dachte nicht?</p>
</blockquote>
<p>stimmt kann man nicht. Im Standard (Kapitel 24.1 Absatz 4) steht dazu:</p>
<blockquote>
<p>the result of the expression *i<br />
(for constant iterator i) cannot be used in an expression where an lvalue is required</p>
</blockquote>
<p>oder auf deutsch: man kann einem '*i' nichts zuweisen und es nicht verändern, wenn 'i' ein const_iterator ist.</p>
<p>templäd schrieb:</p>
<blockquote>
<p>Wann wird denn diese Sache zum Problem?<br />
Hast Du vielleicht ein kleines Beispiel?</p>
</blockquote>
<p>Wenn eine Iterator-Klasse von einem anderen Iterator-Klasse abhängt. Im konkreten Fall war es sowas:</p>
<pre><code class="language-cpp">template&lt; typename Itr, typename V = typename std::iterator_traits&lt; Itr &gt;::value_type &gt;
class MeinIterator : 
    public boost::forward_iterator_helper&lt; CompoundIterator&lt; Itr, V&gt;, V &gt;
{ 
    reference operator*() const
    {
    // ... -&gt; compiler error: kann kein const T&amp; auf T&amp; casten
</code></pre>
<p>das funktioniert nicht, wenn 'Itr' ein const_iterator z.B.: 'const int*' oder std::vector&lt; int &gt;::const_iterator ist.</p>
<p>Wie ich inzwischen festgestellt habe, würde das auch gelten, wenn ich den boost-Iterator-Helper nicht nutze. Dann sähe es so aus:</p>
<pre><code class="language-cpp">template&lt; typename Itr, typename V = typename std::iterator_traits&lt; Itr &gt;::value_type &gt;
class MeinIterator : 
    public std::iterator&lt; std::forward_iterator_tag, V &gt;
{ 
    reference operator*() const
    {
    // ... -&gt; compiler error: kann kein const T&amp; auf T&amp; casten
</code></pre>
<p>genau das gleiche Problem.</p>
<p>Es gibt natürlich Abhilfe, man gibt alle anderen Template-Parameter von boost::forward_iterator_helper&lt;&gt; bzw. std::iterator&lt;&gt; auch an. Aber ich sehe nicht ein wieso, ich will nur den Default-Fall!?</p>
<p>templäd schrieb:</p>
<blockquote>
<p>Auf jeden Fall fände ich es schlimmer, wenn der value_type const wäre.<br />
Beispiel:<br />
ich möchte eine Kopie eines Wertes von einem const_iterator erstellen.<br />
Was sollte diese funktion zurueckgeben?</p>
<pre><code class="language-cpp">template&lt;typename IterType&gt;
typename IterType::value_type getCopy(IterType constIterator)
{
}
</code></pre>
<p>Dann hab ich ne Konstante Kopie toll.<br />
Wenn ich das Glück habe und den Originaltypen kenne kann ich ihn ja jetzt nur mit hässlichem const_cast bearbeiten.<br />
Oder liege ich jetzt total daneben?</p>
</blockquote>
<p>Äh - nicht total, aber doch. Ob der Return-Typ einer Funktion const ist oder nicht ist egal. Dieser Wert kann sowieso nur noch kopiert werden. Da es ein temporäres Objekt ist, darf man darauf keine Aktionen machen, die es verändern. (Bem.: beim VC6-Compiler geht das schon - ist aber falsch) Der Return-Wert ist also implizit eh' const.</p>
<p>Es geht auch weniger um den Wert const T oder T an sich, sondern vielmehr um die Information, die da drinsteckt bzw. nicht mehr drin steckt.<br />
In meinem Code könnte man leicht schreiben:</p>
<pre><code class="language-cpp">const value_type&amp; operator*() const
    {
</code></pre>
<p>das wäre aber auch falsch, wenn der Ausgangs-Iterator eben <strong>kein</strong> const_iterator wäre. Dagegen kann ich aus einem evt. const-Typ mit <a href="http://www.boost.org/doc/html/boost_typetraits/reference.html#boost_typetraits.remove_const" rel="nofollow">remove_const</a> immer den Nicht-const-Typ machen, falls das von Dir angesprochene Problem irgendwo anders auftaucht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236762</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 28 Feb 2007 12:36:42 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 13:06:08 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Zum Beispiel:</p>
<pre><code class="language-cpp">template&lt;typename it&gt; 
typename iterator_traits&lt;it&gt;::value_type average(it st,it en)
{
  typedef typename iterator_traits&lt;it&gt;::value_type val_t;
  val_t sum=val_t();
</code></pre>
</blockquote>
<p>Ah! das ist ein schönes Beispiel. Vielleicht stand die Idee solchen Codes bei der Entscheidung Pate.</p>
<p>Nur - sowas kommt meines Wissens in der ganzen STL nicht vor. Die Algorithmen stehlen sich mit einem kleinen Trick aus der Affäre. z.B.: accumulate:</p>
<pre><code class="language-cpp">template&lt; typename  I, typename T &gt;
T accumulate( I first, I last, T val )
{
    for( ; first != last; first )
        val += *first;
    return val;
}
</code></pre>
<p>indem einfach der Result-Typ als Parameter mitgegeben wird.</p>
<p>Und der boost-Weg könnte - wie vorher schon erwähnt - so aussehen</p>
<pre><code class="language-cpp">template&lt; typename  I &gt;
std::iterator_traits&lt; I &gt;::value_type accumulate2( I first, I last )
{
    typedef boost::remove_const&lt; typename std::iterator_traits&lt; I &gt;::value_type &gt;::type mutable_type;
    mutable_type val = mutable_type();
    for( ; first != last; first )
        val += *first;
    return val;
}
</code></pre>
<p>in beiden Fällen käme man mit einem const T zurecht.</p>
<p>Gruß<br />
Werner<br />
@Edit: copy&amp;paste-Fehler bei accumulate2 korrigiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236785</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 28 Feb 2007 13:06:08 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 13:13:14 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Benutzersname schrieb:</p>
<blockquote>
<p>Kann man denn bei nem const_iterator den Wert verändern? ich dachte nicht?</p>
</blockquote>
<p>stimmt kann man nicht. Im Standard (Kapitel 24.1 Absatz 4) steht dazu:</p>
<blockquote>
<p>the result of the expression *i<br />
(for constant iterator i) cannot be used in an expression where an lvalue is required</p>
</blockquote>
<p>oder auf deutsch: man kann einem '*i' nichts zuweisen und es nicht verändern, wenn 'i' ein const_iterator ist.</p>
</blockquote>
<p>Diese Passage sollte man im neuen Standard ändern (ein Defect Report hab ich auf die schnelle aber nicht gefunden). Wäre die Formulierung so richtig, dann wäre sogar ein einfaches<br />
&amp;*i<br />
nicht erlaubt, das ist aber ein gängiges idiom.<br />
Zum Topic: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#322" rel="nofollow">322. iterator and const_iterator should have the same value type</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236793</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 28 Feb 2007 13:13:14 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist const_iterator::value_type nicht const? on Wed, 28 Feb 2007 13:44:10 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Zum Topic: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#322" rel="nofollow">322. iterator and const_iterator should have the same value type</a></p>
</blockquote>
<p>Das ist doch mal 'ne Information <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
<p>Wenn ich das richtig verstanden habe, begründet Matt Austern in 322.) dieses Ansinnen damit, dass im Standard steht iterator_traits&lt; const T* &gt;::value_type ist 'T'. Das wäre zwar konsequent, aber kein tieferer Grund. Man könnte ja auch den Vorschlag machen, den Standard dahingehend zu ändern, dass iterator_traits&lt; const T* &gt;::value_type 'const T' ist.</p>
<p>Interessanter ist der Hinweis auf <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#279" rel="nofollow">Topic 279</a>. Es geht hier wohl um die Anforderung, dass jeder iterator in sein const_iterator-Pendant konvertierbar sein muss. Das lässt sich relativ leicht implementieren, wenn alle Template-Parameter gleich sind. Topic 279 lässt den value_type interessanterweise bewusst aus. Es steht leider immer wenig über die Hintergründe dabei.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236811</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 28 Feb 2007 13:44:10 GMT</pubDate></item></channel></rss>