<?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[String über const-Iteratoren-Bereich konstruieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte einen String über einen Bereich konstruieren, also den Konstruktor 'basic_string(IT start, IT end)' verwenden. Dabei ist einer der Iteratoren allerdings konstant.</p>
<p>Folgender Code</p>
<pre><code class="language-cpp">#include &lt;string&gt;

int main()
{
    std::string a(&quot;Hallo&quot;);
    std::string::const_iterator ax = a.end();
    std::string b(a.begin(), ax);
}
</code></pre>
<p>funktioniert im MSVC++ 2005 zwar. Im GCC hingegen erhalte ich folgende Fehlermeldung:</p>
<blockquote>
<p>main.cpp:7: error: no matching function for call to `basic_string::basic_string(__gnu_cxx::__normal_iterator&lt;char*, basic_string&gt;, __gnu_cxx::__normal_iterator&lt;const char*, basic_string&gt;&amp;)'<br />
C:/Programme/.../basic_string.tcc:235: note: candidates are: [Auflistung aller möglichen Konstruktoren, nur nicht dessen über einen Bereich]</p>
</blockquote>
<p>Scheinbar ist in den GCC-Headern ein 'basic_string::const_iterator' als Iterator über 'const char*' definiert und der Compiler kann diesen Typ nicht in einen Iterator über 'char*' konvertieren -- oder umgekehrt.</p>
<p>Ist das legales C++? Ist demnach mein Code falsch? Oder ist das Verhalten undefiniert und es ist reine Glückssache, ob mein Code läuft?</p>
<p>Und: Was ist, rein von der Logik, an dem Code auszusetzen? Wäre es nicht sinnvoller, den 'const_iterator' so zu definieren, dass mein Code funktioniert?<br />
Ich hätte erwartet, dass (weil die beiden Parameter ja verschiedenen Typs sind) der Compiler den ersten Parameter implizit nach 'const' castet und als Templatetypen für den Konstruktoraufruf dann IT = 'basic_string::const_iterator' verwendet.</p>
<p>EDIT: Mir fällt gerade auf, wie besch...eiden der Titel gewählt ist. Sorry.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/125248/string-über-const-iteratoren-bereich-konstruieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 06:34:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/125248.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 04 Nov 2005 21:03:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String über const-Iteratoren-Bereich konstruieren on Fri, 04 Nov 2005 21:07:11 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte einen String über einen Bereich konstruieren, also den Konstruktor 'basic_string(IT start, IT end)' verwenden. Dabei ist einer der Iteratoren allerdings konstant.</p>
<p>Folgender Code</p>
<pre><code class="language-cpp">#include &lt;string&gt;

int main()
{
    std::string a(&quot;Hallo&quot;);
    std::string::const_iterator ax = a.end();
    std::string b(a.begin(), ax);
}
</code></pre>
<p>funktioniert im MSVC++ 2005 zwar. Im GCC hingegen erhalte ich folgende Fehlermeldung:</p>
<blockquote>
<p>main.cpp:7: error: no matching function for call to `basic_string::basic_string(__gnu_cxx::__normal_iterator&lt;char*, basic_string&gt;, __gnu_cxx::__normal_iterator&lt;const char*, basic_string&gt;&amp;)'<br />
C:/Programme/.../basic_string.tcc:235: note: candidates are: [Auflistung aller möglichen Konstruktoren, nur nicht dessen über einen Bereich]</p>
</blockquote>
<p>Scheinbar ist in den GCC-Headern ein 'basic_string::const_iterator' als Iterator über 'const char*' definiert und der Compiler kann diesen Typ nicht in einen Iterator über 'char*' konvertieren -- oder umgekehrt.</p>
<p>Ist das legales C++? Ist demnach mein Code falsch? Oder ist das Verhalten undefiniert und es ist reine Glückssache, ob mein Code läuft?</p>
<p>Und: Was ist, rein von der Logik, an dem Code auszusetzen? Wäre es nicht sinnvoller, den 'const_iterator' so zu definieren, dass mein Code funktioniert?<br />
Ich hätte erwartet, dass (weil die beiden Parameter ja verschiedenen Typs sind) der Compiler den ersten Parameter implizit nach 'const' castet und als Templatetypen für den Konstruktoraufruf dann IT = 'basic_string::const_iterator' verwendet.</p>
<p>EDIT: Mir fällt gerade auf, wie besch...eiden der Titel gewählt ist. Sorry.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908487</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 04 Nov 2005 21:07:11 GMT</pubDate></item><item><title><![CDATA[Reply to String über const-Iteratoren-Bereich konstruieren on Fri, 04 Nov 2005 21:21:23 GMT]]></title><description><![CDATA[<p>das ist ein normales verhalten</p>
<p>das liegt an den templates</p>
<pre><code class="language-cpp">template&lt;class T&gt;
void foo(T a,T b);

char* a;
const char* b;

foo(a,b);
</code></pre>
<p>der compiler schaut sich das erste argument an, und schließt daraus(vereinfacht ausgedrückt) T. in deinem fall char*.<br />
nun sieht er den nächsten Parameter, und dort muss der typ nach T konvertierbar sein(das der compiler nicht genauer hinschaut, liegt an den unheimlich komplexen überladungsregeln, die ich noch nicht richtig durchschaut hab^^) in c++ sind aber konstante werte nicht zu nicht konstanten konvertierbar-&gt;fehler. Das ist auch gut so, denn darauf basiert die const-correctness.</p>
<p>laut standard muss jeder iterator in einen const_iterator umwandelbar sein, darauf kannst du dich also zumindest verlassen.</p>
<pre><code class="language-cpp">//für zeiger
foo(const_cast&lt;const char*&gt;(a),b);
</code></pre>
<pre><code class="language-cpp">//für alle iteratoren
typedef /*deinContainer*/ Container;
typedef Container::const_iterator const_iterator;

foo(const_iterator(a),b);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/908499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908499</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Fri, 04 Nov 2005 21:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to String über const-Iteratoren-Bereich konstruieren on Fri, 04 Nov 2005 21:28:27 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<pre><code class="language-cpp">foo(const_iterator(a),b);
</code></pre>
</blockquote>
<p>Danke. Ich hätte irgendwie erwartet, dass sich der Compiler zur Bestimmung des Typenparametertyps (...) nicht nur den ersten Parameter anschaut und obiges daher automatisch macht. Schade.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908510</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 04 Nov 2005 21:28:27 GMT</pubDate></item></channel></rss>