<?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[Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche gerade die Implementation von std::auto_ptr vom VS 2003 zu verstehen. Nun reichen meine Kenntnisse nicht aus, um folgendes Konstrukt zu verstehen:</p>
<pre><code class="language-cpp">template&lt;class _Ty&gt;
class auto_ptr
{
public:
  // ....
  _Ty *operator-&gt;() const _THROW0()
  {
    return (&amp;**this);
  }
  // ....
private:
  _Ty *_Myptr;	// the wrapped object pointer
};
</code></pre>
<p>Ich verstehe nicht warum</p>
<pre><code class="language-cpp">return (&amp;**this)
</code></pre>
<p>dasselbe zurückgibt was auch</p>
<pre><code class="language-cpp">return _Myptr
</code></pre>
<p>zurückgeben würde.</p>
<p>Wie kann es sein, dass die Adresse, die **&amp;<strong>this</strong> liefert, die gleiche ist, worauf <strong>_Myptr</strong> zeigt? Was macht dieses Konstrukt genau?</p>
<p>Ich danke schon mal.</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/131724/was-macht-amp-this-implementation-von-std-auto_ptr-im-vs-2003</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 05:02:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/131724.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Jan 2006 12:54:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 12:54:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche gerade die Implementation von std::auto_ptr vom VS 2003 zu verstehen. Nun reichen meine Kenntnisse nicht aus, um folgendes Konstrukt zu verstehen:</p>
<pre><code class="language-cpp">template&lt;class _Ty&gt;
class auto_ptr
{
public:
  // ....
  _Ty *operator-&gt;() const _THROW0()
  {
    return (&amp;**this);
  }
  // ....
private:
  _Ty *_Myptr;	// the wrapped object pointer
};
</code></pre>
<p>Ich verstehe nicht warum</p>
<pre><code class="language-cpp">return (&amp;**this)
</code></pre>
<p>dasselbe zurückgibt was auch</p>
<pre><code class="language-cpp">return _Myptr
</code></pre>
<p>zurückgeben würde.</p>
<p>Wie kann es sein, dass die Adresse, die **&amp;<strong>this</strong> liefert, die gleiche ist, worauf <strong>_Myptr</strong> zeigt? Was macht dieses Konstrukt genau?</p>
<p>Ich danke schon mal.</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957748</guid><dc:creator><![CDATA[lernwilliger]]></dc:creator><pubDate>Thu, 05 Jan 2006 12:54:09 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 13:07:29 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht ganz sicher, aber der unäre *-Operator ist ja für auto_ptr überladen, ergo ist &amp;**this == Adresse des von operator* zurückgegebenen Objekts. Wahrscheinlich werden da irgendwelche komischen Tricks gemacht, die man in operator-&gt; nicht nochmal machen will.</p>
<p>/edit jo, also bei VS 2005 sieht der operator* in etwa so aus:</p>
<pre><code class="language-cpp">_Ty&amp; operator*() const
{
    return (*(_Ty *)_Myptr);
}
</code></pre>
<p>Frag mich nicht wozu er da so einen ekelhaften C-Cast macht, aber es ist so. Sieht mir irgendwie nach nem Quickhack aus ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957752</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Thu, 05 Jan 2006 13:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 13:10:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für die Antwort. Du hast recht. Ich habe mal in beiden Operatoren (*, -&gt;) Haltepunkte gesetzt, die dann angesprungen wurden.</p>
<p>Verstehe nicht warum das so umständlich ausgedrückt wird. Ein</p>
<pre><code class="language-cpp">return _Myptr
</code></pre>
<p>ist einfacher zu schreiben und sofort zu verstehen. Echt seltsam.</p>
<p>Btw:<br />
Operator * sieht im VS 2003 ganz vernünftig aus:</p>
<pre><code class="language-cpp">_Ty&amp; operator*() const _THROW0()
{
  return (*_Myptr);
}
</code></pre>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957775</guid><dc:creator><![CDATA[lernwilliger]]></dc:creator><pubDate>Thu, 05 Jan 2006 13:10:55 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 13:43:01 GMT]]></title><description><![CDATA[<p>Also die Version aus VS 2003 sieht mir eigentlich nur nach Angeberei seitens<br />
des Programmierers aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Erklären kannst du dir den Ausdruck folgendermaßen, wenn du bedenkst,<br />
dass bei Klassen, die keine virtuellen Methoden enthalten,<br />
this mit der Adresse des ersten Attributs identisch ist.<br />
Im Falle des auto_ptr müsste this == _Myptr sein.<br />
Wird this nun dereferenziert (*this) erhält man das auto_ptr-Objekt selbst.<br />
Dieses kann man ohne Bedenken nach den Datentyp _Ty casten.<br />
*this ist also so ziemlich dasselbe wie _Myptr.<br />
Dereferenziert man *this erhält man **this und damit den dereferenzierten Zeiger<br />
*_Myptr.<br />
Der Adressoperator(&amp;) sorgt nun letztendlich dafür, dass die Adresse des derefernzierten Zeigers *_Myptr zurückgegeben wird.<br />
(Adresse von *_Myptr) == &amp;**this == this == _Myptr.<br />
Ich bin grad etwas durcheinander und übernehme keine Gewähr für Richtigkeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Aber so in der Art kann man sich das vorstellen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957809</guid><dc:creator><![CDATA[Nocternity]]></dc:creator><pubDate>Thu, 05 Jan 2006 13:43:01 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 13:45:27 GMT]]></title><description><![CDATA[<p>denke das &quot;_THROW0()&quot; ist der Grund. Hab zwar keine Ahnung was dieser makro wirklich tut, kann mir aber vorstellen dass der operator vielleicht irgendewann mal eine exception werfen wird wenn _Myptr ugültig ist.<br />
Mit dem konstrukt return (&amp;**this) im operator -&gt; würde diese exception dann auch geworfen werden.<br />
wie .filmor schon sagte &quot;irgendwelche komischen Tricks&quot;<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957815</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Thu, 05 Jan 2006 13:45:27 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 13:49:47 GMT]]></title><description><![CDATA[<p>ich habe bereits in einem früheren thread auf einige fehler in der auto_ptr implementation von vc++ 7.1 und 8.0 hingewiesen.</p>
<p>der grund, warum in vs2005 ein cast notwendig ist, liegt darin, das dort _MyPtr als const T* definiert wird, und das const (sofern es nicht teil von T ist) muss man wieder loswerden - und das ist ein c-style cast.. weil... die immer c-style casts benutzen :p<br />
ein besonderer grund, warum _MyPtr ein zeiger auf const T sein soll, ist allerdings nicht erkennbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957819</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 05 Jan 2006 13:49:47 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 13:53:20 GMT]]></title><description><![CDATA[<p>Nocternity schrieb:</p>
<blockquote>
<p>Also die Version aus VS 2003 sieht mir eigentlich nur nach Angeberei seitens<br />
des Programmierers aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Erklären kannst du dir den Ausdruck folgendermaßen, wenn du bedenkst,<br />
dass bei Klassen, die keine virtuellen Methoden enthalten,<br />
this mit der Adresse des ersten Attributs identisch ist.<br />
Im Falle des auto_ptr müsste this == _Myptr sein.<br />
Wird this nun dereferenziert (*this) erhält man das auto_ptr-Objekt selbst.<br />
Dieses kann man ohne Bedenken nach den Datentyp _Ty casten.<br />
*this ist also so ziemlich dasselbe wie _Myptr.<br />
Dereferenziert man *this erhält man **this und damit den dereferenzierten Zeiger<br />
*_Myptr.<br />
Der Adressoperator(&amp;) sorgt nun letztendlich dafür, dass die Adresse des derefernzierten Zeigers *_Myptr zurückgegeben wird.<br />
(Adresse von *_Myptr) == &amp;**this == this == _Myptr.<br />
Ich bin grad etwas durcheinander und übernehme keine Gewähr für Richtigkeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Aber so in der Art kann man sich das vorstellen</p>
</blockquote>
<p>operator* kann ein ASSERT für den fall _MyPtr == 0 enthalten, oder im falle von vc++8.0 wird es benutz um dem code analyzer zu helfen. generell ist es eine gute idee operator-&gt; mit hilfe von operator* zu imlementieren, genauso wie man andere operatoren@ nach möglichkeit mit hilfe von operator@= implementiert, wenn die semantik des operators das erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957826</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 05 Jan 2006 13:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 13:58:43 GMT]]></title><description><![CDATA[<p>ZuK schrieb:</p>
<blockquote>
<p>denke das &quot;_THROW0()&quot; ist der Grund. Hab zwar keine Ahnung was dieser makro wirklich tut, kann mir aber vorstellen dass der operator vielleicht irgendewann mal eine exception werfen wird wenn _Myptr ugültig ist.</p>
</blockquote>
<p>#define _THROW0() throw ()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957834</guid><dc:creator><![CDATA[lernwilliger]]></dc:creator><pubDate>Thu, 05 Jan 2006 13:58:43 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 14:51:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/11070">@Nocternity</a><br />
Danke für die ausführliche Erklärung. Das hatte ich aber nach dem Hinweis von .filmor auch nachvollziehen können.</p>
<p>camper schrieb:</p>
<blockquote>
<p>operator* kann ein ASSERT für den fall _MyPtr == 0 enthalten</p>
</blockquote>
<p>Tut es in diesem Fall nicht, siehe mein 2. Posting. Daher sieht es nach einem unnötigen Hack aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957850</guid><dc:creator><![CDATA[lernwilliger]]></dc:creator><pubDate>Thu, 05 Jan 2006 14:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 15:39:41 GMT]]></title><description><![CDATA[<p>lernwilliger schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/11070">@Nocternity</a><br />
Danke für die ausführliche Erklärung. Das hatte ich aber nach dem Hinweis von .filmor auch nachvollziehen können.</p>
</blockquote>
<p>Sorry, das muss ich zurücknehmen. Ich habe jetzt dein Posting mal genauer durchgelesen. Dass **&amp;<strong>this</strong> im Falle des std::auto_ptr funktioniert basiert nicht auf der Tatsache, dass bei Klassen ohne V-Table <strong>this</strong> die gleiche Adresse hat wie das erste Datenelement. Das funktioniert aufgrund des überladenen Dereferenzierungsoperators (<em>). Siehe .filmors Beitrag. Ohne überladenen operator</em> wäre nämlich **&amp;<strong>this</strong> nicht kompilierbar.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957900</guid><dc:creator><![CDATA[lernwilliger]]></dc:creator><pubDate>Thu, 05 Jan 2006 15:39:41 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht &amp;amp;**this? (Implementation von std::auto_ptr im VS 2003) on Thu, 05 Jan 2006 15:39:58 GMT]]></title><description><![CDATA[<p>Nocternity schrieb:</p>
<blockquote>
<p>Also die Version aus VS 2003 sieht mir eigentlich nur nach Angeberei seitens<br />
des Programmierers aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Erklären kannst du dir den Ausdruck folgendermaßen, wenn du bedenkst,<br />
dass bei Klassen, die keine virtuellen Methoden enthalten,<br />
this mit der Adresse des ersten Attributs identisch ist.<br />
Im Falle des auto_ptr müsste this == _Myptr sein.<br />
Wird this nun dereferenziert (*this) erhält man das auto_ptr-Objekt selbst.<br />
Dieses kann man ohne Bedenken nach den Datentyp _Ty casten.<br />
*this ist also so ziemlich dasselbe wie _Myptr.<br />
Dereferenziert man *this erhält man **this und damit den dereferenzierten Zeiger<br />
*_Myptr.<br />
Der Adressoperator(&amp;) sorgt nun letztendlich dafür, dass die Adresse des derefernzierten Zeigers *_Myptr zurückgegeben wird.<br />
(Adresse von *_Myptr) == &amp;**this == this == _Myptr.<br />
Ich bin grad etwas durcheinander und übernehme keine Gewähr für Richtigkeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Aber so in der Art kann man sich das vorstellen</p>
</blockquote>
<p>this == Zeiger auf auto_ptr<br />
*this == Reference auf auto_ptr<br />
**this == Reference auf T (durch Benutzung von auto_ptr::operator*)<br />
&amp;*<em>this == Zeiger auf T<br />
Hier wird nur der operator-&gt; mit Hilfe des operator</em> implementiert, kein Hack.</p>
<blockquote>
<p>denke das &quot;_THROW0()&quot; ist der Grund. Hab zwar keine Ahnung was dieser makro wirklich tut, kann mir aber vorstellen dass der operator vielleicht irgendewann mal eine exception werfen wird wenn _Myptr ugültig ist.</p>
</blockquote>
<p>_THROWO markiert ganz einfach eine Funktion die keine Ausnahmen schmeißen kann. Im Standard gibt es throw() was ansich dafür gedacht ist, allerdings bereitet dieses Standardkonstrukt erhebliche <a href="http://www.gotw.ca/publications/mill22.htm" rel="nofollow">Probleme</a>. Es ist aus diesem Grund auch nur Teils im VC umgesetzt und daher kann es auch gut sein, dass das Makro zu nichts expandiert. Jedenfals um flexibel zu bleiben hat mn sich für das Makro entschieden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957902</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Thu, 05 Jan 2006 15:39:58 GMT</pubDate></item></channel></rss>