<?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 kann ich diese Referenz so nicht initilalisieren?]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich möchte gerne eine Referenz initilalisieren. Warum geht das so nicht?</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

class Abc{
public:
	const std::string &amp;sName;
	Abc(const char * cName) : sName(cName) {
	}
};

int main(){
	Abc test(&quot;abc123&quot;);
	std::cout &lt;&lt; &quot;---&quot; &lt;&lt; test.sName &lt;&lt; &quot;--&quot; &lt;&lt; std::endl; // abc123 wird nicht ausgegeben.
}
</code></pre>
<p>Der Kompiler meint schon beim Kompilieren:</p>
<blockquote>
<p>Der Verweismember wird mit einem temporären Wert initialisiert, der nach dem Beenden des Konstruktors nicht beibehalten wird.</p>
</blockquote>
<p>Im Konstruktor wird doch der char* in ein std::string umgewandelt. Warum wird dieser dann nicht sName zugewiesen? Mir geht es mehr ums Verstehen als darum den Code zum Laufen zu bekommen.</p>
<p>Vielen Dank</p>
<p>Barney</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263067/warum-kann-ich-diese-referenz-so-nicht-initilalisieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 03:13:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263067.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Mar 2010 14:41:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum kann ich diese Referenz so nicht initilalisieren? on Mon, 15 Mar 2010 14:41:43 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich möchte gerne eine Referenz initilalisieren. Warum geht das so nicht?</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

class Abc{
public:
	const std::string &amp;sName;
	Abc(const char * cName) : sName(cName) {
	}
};

int main(){
	Abc test(&quot;abc123&quot;);
	std::cout &lt;&lt; &quot;---&quot; &lt;&lt; test.sName &lt;&lt; &quot;--&quot; &lt;&lt; std::endl; // abc123 wird nicht ausgegeben.
}
</code></pre>
<p>Der Kompiler meint schon beim Kompilieren:</p>
<blockquote>
<p>Der Verweismember wird mit einem temporären Wert initialisiert, der nach dem Beenden des Konstruktors nicht beibehalten wird.</p>
</blockquote>
<p>Im Konstruktor wird doch der char* in ein std::string umgewandelt. Warum wird dieser dann nicht sName zugewiesen? Mir geht es mehr ums Verstehen als darum den Code zum Laufen zu bekommen.</p>
<p>Vielen Dank</p>
<p>Barney</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869326</guid><dc:creator><![CDATA[Barney*grps*]]></dc:creator><pubDate>Mon, 15 Mar 2010 14:41:43 GMT</pubDate></item><item><title><![CDATA[Reply to Warum kann ich diese Referenz so nicht initilalisieren? on Mon, 15 Mar 2010 14:45:44 GMT]]></title><description><![CDATA[<p>Barney<em>grps</em> schrieb:</p>
<blockquote>
<p>Der Kompiler meint schon beim Kompilieren:</p>
<blockquote>
<p>Der Verweismember wird mit einem temporären Wert initialisiert, der nach dem Beenden des Konstruktors nicht beibehalten wird.</p>
</blockquote>
<p>Im Konstruktor wird doch der char* in ein std::string umgewandelt.</p>
</blockquote>
<p>Richtig. In ein temporäres Objekt vom typ std::string.</p>
<blockquote>
<p>Warum wird dieser dann nicht sName zugewiesen?</p>
</blockquote>
<p>Wird er doch. Die Referenz wird an das temporäre Objekt gebunden. Genau das bemängelt der Compiler ja auch. Das temporäre Objekt ist sofort nach dem Ctor-Aufruf zerstört und der Zugriff auf die Referenz undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869329</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 15 Mar 2010 14:45:44 GMT</pubDate></item><item><title><![CDATA[Reply to Warum kann ich diese Referenz so nicht initilalisieren? on Mon, 15 Mar 2010 14:46:00 GMT]]></title><description><![CDATA[<p>Der Char-Pointer wird in ein String umgewandelt, richtig. Und eine Referenz auf dieses temporäre Objekt speicherst du.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869330</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 15 Mar 2010 14:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Warum kann ich diese Referenz so nicht initilalisieren? on Mon, 15 Mar 2010 14:55:56 GMT]]></title><description><![CDATA[<p>Ach so, die Referenz ist sowas wie ein Pointer. Da das String Objekt jedoch nur während des Ctor Aufruf exisitiert ist es danach wieder ungültig.</p>
<p>Ich habe den CTor Aufruf erstmal so geändert:<br />
Abc(const char * cName) : sName(*(new std::string(cName))) {}<br />
So häßlich wie das aussieht werd' ich da nochmal umdesignen...</p>
<p>Vielen Dank Pumuckl und Fellhuhn <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1869339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869339</guid><dc:creator><![CDATA[Barney*grps*]]></dc:creator><pubDate>Mon, 15 Mar 2010 14:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to Warum kann ich diese Referenz so nicht initilalisieren? on Mon, 15 Mar 2010 15:53:14 GMT]]></title><description><![CDATA[<p>Mach es einfach so:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

struct Abc
{
    std::string const sName;

    Abc(const char * cName)
    : sName(cName)
    {}
};

int main(){
    Abc test(&quot;abc123&quot;);
    std::cout &lt;&lt; &quot;---&quot; &lt;&lt; test.sName &lt;&lt; &quot;--&quot; &lt;&lt; std::endl;.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1869372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869372</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Mon, 15 Mar 2010 15:53:14 GMT</pubDate></item><item><title><![CDATA[Reply to Warum kann ich diese Referenz so nicht initilalisieren? on Mon, 15 Mar 2010 16:40:17 GMT]]></title><description><![CDATA[<p>Die Frage ist trotzdem interessant. Laut Standard sind const references auf temporaries erlaubt, warum beschwert sich der Compiler hier?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869409</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 15 Mar 2010 16:40:17 GMT</pubDate></item><item><title><![CDATA[Reply to Warum kann ich diese Referenz so nicht initilalisieren? on Mon, 15 Mar 2010 16:44:06 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Die Frage ist trotzdem interessant. Laut Standard sind const references auf temporaries erlaubt, warum beschwert sich der Compiler hier?</p>
</blockquote>
<p>1. Ich denke, dass mit beschweren hier eine Warnung gemeint ist.<br />
2. Wieso diese Warnung kommt, wurde von pumuckl und Fellhuhn erklärt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869412</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 15 Mar 2010 16:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to Warum kann ich diese Referenz so nicht initilalisieren? on Mon, 15 Mar 2010 17:00:43 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Die Frage ist trotzdem interessant. Laut Standard sind const references auf temporaries erlaubt, warum beschwert sich der Compiler hier?</p>
</blockquote>
<p><a href="http://herbsutter.wordpress.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/" rel="nofollow">http://herbsutter.wordpress.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/</a></p>
<p>sagt da was, man achte auf die Details:</p>
<blockquote>
<p>However, C++ deliberately specifies that binding a temporary object to a reference to const <strong>on the stack</strong> lengthens the lifetime of the temporary to the lifetime of the reference itself</p>
</blockquote>
<p>Da Objekte mal auf dem Stack und mal auf dem heap liegen können heißt das wohl im Ganzen, dass sich das nur auf ref-to-const in Funktionsblöcken bezieht sowie auf globale.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869419</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 15 Mar 2010 17:00:43 GMT</pubDate></item></channel></rss>