<?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[Var x = y nicht immer ctor?]]></title><description><![CDATA[<p>Hi,</p>
<p>ich dachte, Var x = y sei ein Synonym für Var x(y) und dass immer der ctor aufgerufen wird. Jedoch scheint dies nicht zu stimmen, wenn man eine Variable eines inneren Scopes mit einer gleichnamigen Variable des äußeren Scopes initialisieren möchte:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Test
{
private:
	int x;

public:
	Test(int x) : x(x) {}
	int GetX() const {return x;}
};

ostream&amp; operator&lt;&lt;(ostream&amp; os, const Test&amp; t)
{
	os &lt;&lt; t.GetX();
	return os;
}

int main()
{
	int z = 10;

	Test test = 20;
	cout &lt;&lt; test;

	{
		int z = z;

		std::cout &lt;&lt; z;
	}

	std::cin.get();

	return 0;
}
</code></pre>
<p>Das hier gibt 20 aus und dann dumpt MSVC bei int z = z mit Runtime-Check-Error, weil die uninitialisierte Variable z verwendet wird.</p>
<p>Gibt es dazu mehr zu sagen, als dass es nun eben so ist? Das offensichtliche Problem ist ja, dass die Initialisierung von z nach der Definition erfolgt. Ich kann diese Nachzeitigkeit aber nicht verstehen, weil int z(z) eben das erwartete Verhalten zeigt. Trotzdem wird ja der copy-ctor aufgerufen, aber dem Scope ist das lokale z einmal bereits bekannt und einmal nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308417/var-x-y-nicht-immer-ctor</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 21:11:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308417.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Sep 2012 17:46:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Mon, 24 Sep 2012 17:52:02 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich dachte, Var x = y sei ein Synonym für Var x(y) und dass immer der ctor aufgerufen wird. Jedoch scheint dies nicht zu stimmen, wenn man eine Variable eines inneren Scopes mit einer gleichnamigen Variable des äußeren Scopes initialisieren möchte:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Test
{
private:
	int x;

public:
	Test(int x) : x(x) {}
	int GetX() const {return x;}
};

ostream&amp; operator&lt;&lt;(ostream&amp; os, const Test&amp; t)
{
	os &lt;&lt; t.GetX();
	return os;
}

int main()
{
	int z = 10;

	Test test = 20;
	cout &lt;&lt; test;

	{
		int z = z;

		std::cout &lt;&lt; z;
	}

	std::cin.get();

	return 0;
}
</code></pre>
<p>Das hier gibt 20 aus und dann dumpt MSVC bei int z = z mit Runtime-Check-Error, weil die uninitialisierte Variable z verwendet wird.</p>
<p>Gibt es dazu mehr zu sagen, als dass es nun eben so ist? Das offensichtliche Problem ist ja, dass die Initialisierung von z nach der Definition erfolgt. Ich kann diese Nachzeitigkeit aber nicht verstehen, weil int z(z) eben das erwartete Verhalten zeigt. Trotzdem wird ja der copy-ctor aufgerufen, aber dem Scope ist das lokale z einmal bereits bekannt und einmal nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254024</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 24 Sep 2012 17:52:02 GMT</pubDate></item><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Mon, 24 Sep 2012 17:50:44 GMT]]></title><description><![CDATA[<p>klingt mir eher so, als würde der VC versuchn, Z mit sich selbst zu initialisieren. als nicht das äußere, sondern das innere z verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254027</guid><dc:creator><![CDATA[otze_logoout]]></dc:creator><pubDate>Mon, 24 Sep 2012 17:50:44 GMT</pubDate></item><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Mon, 24 Sep 2012 17:53:13 GMT]]></title><description><![CDATA[<p>Ja, das ist ja auch so. Aber ich dachte, die Ausdrücke int x = y und int x(y) wären äquivalent. Wäre das so, würde er ja nicht dumpen, denn int z(z) funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254028</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 24 Sep 2012 17:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Mon, 24 Sep 2012 17:59:10 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Wäre das so, würde er ja nicht dumpen, denn int z(z) funktioniert.</p>
</blockquote>
<p>Zwischen</p>
<pre><code class="language-cpp">int x = 3;
int y = x;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">int x = 3;
int y (x);
</code></pre>
<p>gibt es auch keinen Unterschied ... nicht bei int ...</p>
<p>z mit sich selbst zu initialisieren ist immer 'ne blöde Idee. Egal, welche Syntax du verwendest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254032</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 24 Sep 2012 17:59:10 GMT</pubDate></item><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Mon, 24 Sep 2012 18:03:58 GMT]]></title><description><![CDATA[<p>Im Prinzip ist copy-initialisation (also <code>T x = y</code> ) nichts anderes als direct-initialisation (also mit Klammern), falls aber der Zieltyp eine Klasse ist, muss <strong>der Zieltyp (also <code>T</code> ) bei copy-initialisation aber einen copy-ctor und einen entsprechenden Konvertierungskonstruktor bereitstellen</strong> (auch wenn der nicht genutzt wird!).</p>
<p>Edit: Ich bin zu spät und der TE ist Eisflamme (also, kein Anfänger). Fail.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254035</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 24 Sep 2012 18:03:58 GMT</pubDate></item><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Mon, 24 Sep 2012 18:28:49 GMT]]></title><description><![CDATA[<p>Ich faile gern. Meist lern ich dabei ganz gut.</p>
<p>Ich faile jetzt sogar noch weiter, denn ich verstehe es immer noch nicht. Also wieso geht Syntax A und Syntax B aber nicht. Ich will ja keine Selbstinitialisierung, es sieht nur so aus:</p>
<p>Syntax A:</p>
<pre><code class="language-cpp">int z = 10;
{
    int z(z); // inner scope z soll mit outer scope z initialisiert werden
} // und das hier geht so wie gewünscht!
</code></pre>
<p>Syntax B:</p>
<pre><code class="language-cpp">int z = 10;
{
    int z = z; // geht nicht
}
</code></pre>
<p>Hm, vielleicht wurde das schon verstanden, aber die Antworten gehen ja an meiner Frage vorbei, ob es theoretisch einen Unterschied gibt. Praktisch gibt es halt keinen, daher nahm ich an, dass die Ausdrücke syntaktisch auch gleich sind. Denn wenn das = nicht als Zuweisungoperator fundiert, sondern für Constructor-Aufruf genutzt wird, hätte ich eben gedacht, es sei dasselbe. Und gleichnamige Variablen unterschiedlicher Scopes miteinander zu initialisieren ist ja per se keine schlimme Idee, das macht man bei Elementinitialisierern in Klassen doch auch:</p>
<pre><code class="language-cpp">class Test
{
private:
    int x;

public:
    Test(int x) : x(x) {} // valide und stilistisch in meinen Augen auch nicht verwerflich!
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2254045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254045</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 24 Sep 2012 18:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Mon, 24 Sep 2012 19:48:12 GMT]]></title><description><![CDATA[<p>Ein Bezeichner gilt als deklariert am Ende der zugehörigen Deklaratorsequenz (3.3.2)</p>
<pre><code class="language-cpp">T x(y)   ;
//     ^ hier

T x = y;
// ^ hier
enum x { ... };
//    ^ hier

auto foo(int x , int y(int) ) -&gt; decltype(y(x)) ;
//            ^x           ^y                  ^foo
</code></pre>
<p>Für Skalare besteht kein semantischer Unterschied zwischen den verschiedenen Initialisierungsformen. In deinem Code verweisen die Initialisierer allerdings auf verschiedene Objekte.</p>
<p>Da in</p>
<pre><code class="language-cpp">int z = z;
</code></pre>
<p>an der Stelle des Initialisierers der gerade deklarierte Bezeichner sichtbar ist, findet hier ein (undefinierte) Selbstinitialisierung statt.<br />
In</p>
<pre><code class="language-cpp">class Test
{
private:
    int x;

public:
    Test(int x) : x(x) {} // valide und stilistisch in meinen Augen auch nicht verwerflich!
};
</code></pre>
<p>Liegen die Verhältnisse anders: in der Memberinitialisierungsliste werden Member und Basisklassen initialisiert, es werden also von vornherein nur diese (im Scope der Klasse) gesucht, der initialisierende Ausdruck befindet sich hingen im Scope des jeweiligen Konstruktors, findet also ggf. auch Funktionsparameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254057</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 24 Sep 2012 19:48:12 GMT</pubDate></item><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Mon, 24 Sep 2012 20:20:34 GMT]]></title><description><![CDATA[<p>Okay, dankeschöööööööööön. <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/2254086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254086</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 24 Sep 2012 20:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Tue, 25 Sep 2012 07:37:07 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Im Prinzip ist copy-initialisation (also <code>T x = y</code> ) nichts anderes als direct-initialisation (also mit Klammern), falls aber der Zieltyp eine Klasse ist, muss <strong>der Zieltyp (also <code>T</code> ) bei copy-initialisation aber einen copy-ctor und einen entsprechenden Konvertierungskonstruktor bereitstellen</strong> (auch wenn der nicht genutzt wird!).</p>
<p>Edit: Ich bin zu spät und der TE ist Eisflamme (also, kein Anfänger). Fail.</p>
</blockquote>
<p>Jo, und falsch ist es auch noch. Hatten wir doch schon mal, das Thema mit dem Konvertierungskonstruktor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254167</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:37:07 GMT</pubDate></item><item><title><![CDATA[Reply to Var x = y nicht immer ctor? on Tue, 25 Sep 2012 16:05:01 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Im Prinzip ist copy-initialisation (also <code>T x = y</code> ) nichts anderes als direct-initialisation (also mit Klammern), falls aber der Zieltyp eine Klasse ist, muss <strong>der Zieltyp (also <code>T</code> ) bei copy-initialisation aber einen copy-ctor und einen entsprechenden Konvertierungskonstruktor bereitstellen</strong> (auch wenn der nicht genutzt wird!).</p>
<p>Edit: Ich bin zu spät und der TE ist Eisflamme (also, kein Anfänger). Fail.</p>
</blockquote>
<p>Jo, und falsch ist es auch noch. Hatten wir doch schon mal, das Thema mit dem Konvertierungskonstruktor.</p>
</blockquote>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254327</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 25 Sep 2012 16:05:01 GMT</pubDate></item></channel></rss>