<?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[Vorrang von Konvertierungsoperator &amp;amp; std::addressof]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>aufgrund eines anderes Threads bin ich auf std::addressof aufmerksam geworden: <a href="http://en.cppreference.com/w/cpp/memory/addressof" rel="nofollow">http://en.cppreference.com/w/cpp/memory/addressof</a></p>
<p>Von dieser Seite stammt folgender Code-Ausschnitt:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;memory&gt;

template&lt;class T&gt;
struct Ptr {
   T* data;
   Ptr(T* arg) : data(arg) {}
   ~Ptr() {delete data;}
   T** operator&amp;() { return &amp;data; }
};

template&lt;class T&gt;
void f(Ptr&lt;T&gt;* p) {
    std::cout &lt;&lt; &quot;Ptr overload called with p = &quot; &lt;&lt; p &lt;&lt; '\n';
}

void f(int** p) {
    std::cout &lt;&lt; &quot;int** overload called with p = &quot; &lt;&lt; p &lt;&lt; '\n';
}

int main()
{
    Ptr&lt;int&gt; p(new int(42));
    f(&amp;p);                 // calls int** overload
    f(std::addressof(p));  // calls Ptr&lt;int&gt;* overload
}
</code></pre>
<blockquote>
<p>int** overload called with p = 0xbfba870c<br />
Ptr overload called with p = 0xbfba870c</p>
</blockquote>
<p>Okay... Jetzt verstehe ich den Sinn von std::addressof, aber ich frage mich welchen Sinn es macht, dass der Konvertierungsoperator ohne std::addressof-Verwendung eine höhere Priorität hat. Irgendetwas wird man sich ja sicherlich dabei gedacht haben...<br />
Hat irgendjemand evtl. eine Erklärung dafür? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316307/vorrang-von-konvertierungsoperator-amp-std-addressof</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 09:36:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316307.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Apr 2013 01:35:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Mon, 29 Apr 2013 01:35:00 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>aufgrund eines anderes Threads bin ich auf std::addressof aufmerksam geworden: <a href="http://en.cppreference.com/w/cpp/memory/addressof" rel="nofollow">http://en.cppreference.com/w/cpp/memory/addressof</a></p>
<p>Von dieser Seite stammt folgender Code-Ausschnitt:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;memory&gt;

template&lt;class T&gt;
struct Ptr {
   T* data;
   Ptr(T* arg) : data(arg) {}
   ~Ptr() {delete data;}
   T** operator&amp;() { return &amp;data; }
};

template&lt;class T&gt;
void f(Ptr&lt;T&gt;* p) {
    std::cout &lt;&lt; &quot;Ptr overload called with p = &quot; &lt;&lt; p &lt;&lt; '\n';
}

void f(int** p) {
    std::cout &lt;&lt; &quot;int** overload called with p = &quot; &lt;&lt; p &lt;&lt; '\n';
}

int main()
{
    Ptr&lt;int&gt; p(new int(42));
    f(&amp;p);                 // calls int** overload
    f(std::addressof(p));  // calls Ptr&lt;int&gt;* overload
}
</code></pre>
<blockquote>
<p>int** overload called with p = 0xbfba870c<br />
Ptr overload called with p = 0xbfba870c</p>
</blockquote>
<p>Okay... Jetzt verstehe ich den Sinn von std::addressof, aber ich frage mich welchen Sinn es macht, dass der Konvertierungsoperator ohne std::addressof-Verwendung eine höhere Priorität hat. Irgendetwas wird man sich ja sicherlich dabei gedacht haben...<br />
Hat irgendjemand evtl. eine Erklärung dafür? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319536</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Mon, 29 Apr 2013 01:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Mon, 29 Apr 2013 02:08:25 GMT]]></title><description><![CDATA[<p>Da gibt's keinen Konvertierungsoperator sondern da wurde operator &amp; überladen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319537</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 29 Apr 2013 02:08:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Mon, 29 Apr 2013 02:45:26 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Da gibt's keinen Konvertierungsoperator sondern da wurde operator &amp; überladen?</p>
</blockquote>
<p>Okay... Manchmal sollte man besser ins Bett gehen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319539</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Mon, 29 Apr 2013 02:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Mon, 29 Apr 2013 19:32:03 GMT]]></title><description><![CDATA[<p>interessant ist, wie dieser adressof-Operator funktioniert; dann kommt man auch drauf, was da noch alles für alles Fallstricke dabei sind.<br />
Man probiere folgendes mit Microsoft VC10:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;memory&gt;
#include &lt;boost/utility/addressof.hpp&gt;

template&lt;class T&gt;
struct Ptr {
   T* data;
   Ptr(T* arg) : data(arg) {}
   ~Ptr() {delete data;}
   T** operator&amp;() { return &amp;data; }

   operator char&amp;() { return c_; }
   char c_;
};

template&lt;class T&gt;
void f(Ptr&lt;T&gt;* p) {
    std::cout &lt;&lt; &quot;Ptr overload called with p = &quot; &lt;&lt; p &lt;&lt; '\n';
}
void f(int** p) {
    std::cout &lt;&lt; &quot;int** overload called with p = &quot; &lt;&lt; p &lt;&lt; '\n';
}

int main()
{
    Ptr&lt;int&gt; p(new int(42));
    f(&amp;p);                 // calls int** overload
    f(std::addressof(p));  // calls Ptr&lt;int&gt;* overload
    std::cout &lt;&lt; &quot;boost: &quot;;
    f(boost::addressof(p));  // calls Ptr&lt;int&gt;* overload
}
</code></pre>
<p>und raus kommt:</p>
<pre><code>int** overload called with p = 0012FF50
Ptr overload called with p = 0012FF54
boost: Ptr overload called with p = 0012FF50
</code></pre>
<p>wenn einem das in einem größeren Programm passiert, dann kann das Fehler suchen schon dauern.<br />
.. und es ist immer wieder erstaunlich, dass ein Programm, was von Leuten geschrieben wurden, die einfach engagiert sind, aber kein Geld dafür kriegen, dem Output einer weltweit operierenden Firma überlegen ist. Zumal die Mitarbeiter/Zulieferer der letzteren es einfach hätten kopieren können, denn boost::adressof war ja schon da.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319729</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 29 Apr 2013 19:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Mon, 29 Apr 2013 19:38:41 GMT]]></title><description><![CDATA[<p>Offen gesagt verstehe ich nicht mal, wo da jetzt der Fehler ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319730</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 29 Apr 2013 19:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Mon, 29 Apr 2013 19:46:00 GMT]]></title><description><![CDATA[<p>Ergänzung zu Werners Beitrag: Beim VC11 passt es.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319734</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 29 Apr 2013 19:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Mon, 29 Apr 2013 19:46:16 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Offen gesagt verstehe ich nicht mal, wo da jetzt der Fehler ist?</p>
</blockquote>
<p>Schau auf den Output. std::adressof und boost::adressof liefern verschiedene Werte (0x0012FF54 != 0x0012FF50), d.h. mindestens eine adressof-Funktion liefert einen Pointer, der nicht auf das Objekt zeigt; liegt also falsch.<br />
std::adressof (MS VC10) liefert eben nicht den Pointer auf das Objekt sondern auf den char-member 'c_'.</p>
<p>Passiert Dir das in einem Programm, wo dieser Pointer-Wert irgendwie weiter benutzt wird, so passiert alles mögliche, aber nicht was das Programm tun soll.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319735</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 29 Apr 2013 19:46:16 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Tue, 30 Apr 2013 09:15:14 GMT]]></title><description><![CDATA[<p>Also wird die MS Implementierung wohl stupide die Referenz auf char&amp; casten und davon die Addresse nehmen?<br />
Was ist denn die sichere Variante?</p>
<p>Btw müsste</p>
<pre><code>template&lt;typename T&gt;
T* addressof(T&amp; v)
{
    T* p = &amp;v;
    return p;
}
</code></pre>
<p>nicht langen? Schließlich sind beide Referenzierungsoperatoren kein Match, da weder int** noch char&amp; nach T* konvertiert werden können ... oder stoppt der Compiler dann anstatt als dritte Möglichkeit einfach den builtin-Operator zu verwenden, der einfach nur die Addresse des Objekts nimmt?</p>
<p>Edit: Ahh ... du hast ja nur einen Referenzierungsoperator definiert, der andere ist ja kein Castoperator ... nicht richtig gelesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319833</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Tue, 30 Apr 2013 09:15:14 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Tue, 30 Apr 2013 09:32:33 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Was ist denn die sichere Variante?</p>
</blockquote>
<p>z.B. so</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T* addressof(T&amp; x)
{
    return const_cast&lt;T*&gt;(reinterpret_cast&lt;const volatile T*&gt;(&amp;reinterpret_cast&lt;const volatile char&amp;&gt;(x)));
}
</code></pre>
<p>Ein kleiner Nachteil gegenüber dem eingebauten &amp;-Operator besteht darin, dass addressof nicht constexpr sein kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319839</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 30 Apr 2013 09:32:33 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Tue, 30 Apr 2013 09:33:53 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>Was ist denn die sichere Variante?</p>
</blockquote>
<p>z.B. so</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T* addressof(T&amp; x)
{
    return const_cast&lt;T*&gt;(reinterpret_cast&lt;const volatile T*&gt;(&amp;reinterpret_cast&lt;const volatile char&amp;&gt;(x)));
}
</code></pre>
<p>Ein kleiner Nachteil gegenüber dem eingebauten &amp;-Operator besteht darin, dass addressof nicht constexpr sein kann.</p>
</blockquote>
<p>Und warum stört hierbei nicht der Konvertierungsoperator?</p>
<pre><code>operator char&amp;() { return c_; }
</code></pre>
<p>char&amp; ist ja in char const volatile&amp; konvertierbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319841</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Tue, 30 Apr 2013 09:33:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Tue, 30 Apr 2013 09:39:17 GMT]]></title><description><![CDATA[<p>reinterpret_cast führt niemals zum Aufruf von Konstruktoren oder Konvertierungsoperatoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319844</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 30 Apr 2013 09:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Tue, 30 Apr 2013 09:46:24 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>reinterpret_cast führt niemals zum Aufruf von Konstruktoren oder Konvertierungsoperatoren.</p>
</blockquote>
<p>Stimmt. Dann frage ich mich wie man es überhaupt falsch implementieren kann. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319847</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Tue, 30 Apr 2013 09:46:24 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Tue, 30 Apr 2013 09:52:23 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Stimmt. Dann frage ich mich wie man es überhaupt falsch implementieren kann. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>VC10 schrieb:</p>
<blockquote>
<pre><code>template&lt;class _Ty&gt; inline
	_Ty * addressof(_Ty&amp; _Val)
	{	// return address of _Val
	return ((_Ty *) &amp;(char&amp;)_Val);
	}
</code></pre>
</blockquote>
<p>So kann man es falsch machen, Ethon <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .</p>
<p>VC11 schrieb:</p>
<blockquote>
<pre><code>template&lt;class _Ty&gt; inline
	_Ty *addressof(_Ty&amp; _Val) _NOEXCEPT
	{	// return address of _Val
	return (reinterpret_cast&lt;_Ty *&gt;(
		(&amp;const_cast&lt;char&amp;&gt;(
		reinterpret_cast&lt;const volatile char&amp;&gt;(_Val)))));
	}
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319848</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Tue, 30 Apr 2013 09:52:23 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Tue, 30 Apr 2013 10:40:16 GMT]]></title><description><![CDATA[<p>Und das ist der Grund, warum die Cast-Notation (und mit gewissen Einschränkungen auch die funktionale Notation) böse ist. Es ist nicht immer sofort offensichtlich, wie der Cast zu interpretieren ist (z.T. sogar dann, wenn der gesamte Quellcode bekannt ist 5.4./5)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319854</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 30 Apr 2013 10:40:16 GMT</pubDate></item><item><title><![CDATA[Reply to Vorrang von Konvertierungsoperator &amp;amp; std::addressof on Tue, 30 Apr 2013 11:02:02 GMT]]></title><description><![CDATA[<p>zum Glück gibt es ja 5.2.10 11</p>
<blockquote>
<p>An lvalue expression of type T1 can be cast to the type “reference to T2” if an expression of type “pointer to T1” can be explicitly converted to the type “pointer to T2” using a reinterpret_cast. That is, a reference cast reinterpret_cast&lt;T&amp;&gt;(x) has the same effect as the conversion *reinterpret_cast&lt;T*&gt;(&amp;x) with the built-in &amp; and * operators (and similarly for reinterpret_cast&lt;T&amp;&amp;&gt;(x)). The result refers to the same object as the source lvalue, but with a different type. The result is an lvalue for an lvalue reference type or an rvalue reference to function type and an xvalue for an rvalue reference to object type. No temporary is created, no copy is made, and constructors (12.1) or conversion functions (12.3) are not called.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2319857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319857</guid><dc:creator><![CDATA[dd++ 0]]></dc:creator><pubDate>Tue, 30 Apr 2013 11:02:02 GMT</pubDate></item></channel></rss>