<?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[Umgehung des const-Referenz-Status von Temporaries]]></title><description><![CDATA[<p>Ich habe etwa folgenden Code, und der compiliert auch:</p>
<pre><code class="language-cpp">class xyz {
  xyz();

  xyz(xyz &amp;);

  operator xyz&amp;() {
    return *this;
  }
};

...

void foo(xyz &amp;);

...

foo(xyz());
</code></pre>
<p>Ist das legal?</p>
<p>Bzw. warum sollte ich das nicht machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186280/umgehung-des-const-referenz-status-von-temporaries</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 08:11:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186280.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Jul 2007 18:35:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 18:35:50 GMT]]></title><description><![CDATA[<p>Ich habe etwa folgenden Code, und der compiliert auch:</p>
<pre><code class="language-cpp">class xyz {
  xyz();

  xyz(xyz &amp;);

  operator xyz&amp;() {
    return *this;
  }
};

...

void foo(xyz &amp;);

...

foo(xyz());
</code></pre>
<p>Ist das legal?</p>
<p>Bzw. warum sollte ich das nicht machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319908</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Fri, 06 Jul 2007 18:35:50 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 19:33:18 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>da steht alles dazu <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 />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39474.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-39474.html</a></p>
<p>Edit: Ups, hätte wohl nicht den Code so überfliegen sollen, trotzdem ist der Link gut <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="😉"
    /> ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319934</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 06 Jul 2007 19:33:18 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 19:34:33 GMT]]></title><description><![CDATA[<p>Mr. N schrieb:</p>
<blockquote>
<p>Ist das legal?</p>
</blockquote>
<p>Nein, allerdings nur, weil Konvertierungsoperatoren nicht implizit für Konvertierungen in die selbe Klasse oder eine Basisklasse aufgerufen werden [12.3.2/1 S.6] (sollen, msvc hält sich z.B. nicht daran).</p>
<p>Was möglich ist, wäre z.B.</p>
<pre><code class="language-cpp">struct foo
{
    foo&amp; self() {return *this;}
};
void bar(foo&amp;);
int main()
{
    bar(foo().self());
}
</code></pre>
<p>Daran ist nichts verbotenes - sofern du einen guten Grund hast, ist daran nichts auszusetzen - beachte aber, dass das Temporary in jedem Falle am Ende des Ausdrucks zerstört wird. Also z.B. auch dann:</p>
<pre><code class="language-cpp">int main()
{
    const foo&amp; x = foo().self();
    foo y = x; // ups, x verweist auf ein bereits zerstörtes Objekt
}
</code></pre>
<p>ein interessanteres Beispiel wäre:</p>
<pre><code class="language-cpp">struct x { x(int); };
...
x&amp; y = x() = 1;
x z = y; // boom
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1319937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319937</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 06 Jul 2007 19:34:33 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 19:34:53 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Mr. N schrieb:</p>
<blockquote>
<p>Ist das legal?</p>
</blockquote>
<p>Nein, allerdings nur, weil Konvertierungsoperatoren nicht implizit für Konvertierungen in die selbe Klasse oder eine Basisklasse aufgerufen werden [12.3.2/1 S.6] (sollen, msvc hält sich z.B. nicht daran).</p>
</blockquote>
<p>GCC auch nicht. Benutzt auto_ptr deshalb diese merkwürdige auto_ptr_ref-Klasse?</p>
<p>camper schrieb:</p>
<blockquote>
<p>Was möglich ist, wäre z.B.</p>
<pre><code class="language-cpp">class foo
{
public:
    foo&amp; self();
};
void bar(foo&amp;);
int main()
{
    bar(foo().self());
}
</code></pre>
<p>Daran ist nichts verbotenes - sofern du einen guten Grund hast, ist daran nichts auszusetzen - beachte aber, dass das Temporary in jedem Falle am Ende des Ausdrucks zerstört wird. Also z.B. auch dann:</p>
<pre><code class="language-cpp">int main()
{
    const foo&amp; x = foo().self();
    foo y = x; // ups, x verweist auf ein bereits zerstörtes Objekt
}
</code></pre>
</blockquote>
<p>Das mit dem self() ist ziemlich umständlich.</p>
<p>Vielleicht nehme ich die Illegalität einfach in Kauf.</p>
<p>Aber es gibt noch einen Punkt, auf den ich anderswo hingewiesen wurde: Ein Temporary als Non-Const-Referenz zu behandeln sei UB.</p>
<p>KasF schrieb:</p>
<blockquote>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39474.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-39474.html</a></p>
</blockquote>
<p>Was hat das mit meinem Problem zu tun oder versteh ich den Thread nur nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319943</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Fri, 06 Jul 2007 19:34:53 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 19:44:36 GMT]]></title><description><![CDATA[<p>Mr. N schrieb:</p>
<blockquote>
<p>Was hat das mit meinem Problem zu tun oder versteh ich den Thread nur nicht?</p>
</blockquote>
<p>Sry. Siehe mein Edit. Habe einfach blind draufgeschaut und dachte es geht nur um das binden von temporären Objekten an Referenzparametern ....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319946</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 06 Jul 2007 19:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 19:49:20 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Mr. N schrieb:</p>
<blockquote>
<p>Was hat das mit meinem Problem zu tun oder versteh ich den Thread nur nicht?</p>
</blockquote>
<p>Sry. Siehe mein Edit. Habe einfach blind draufgeschaut und dachte es geht nur um das binden von temporären Objekten an Referenzparametern ....</p>
</blockquote>
<p>Was mich irritiert ist, dass gleich der erste Code in dem Thread nicht compiliert.</p>
<pre><code>&lt;stdin&gt;:9: error: invalid initialization of non-const reference of type 'X&amp;' from a temporary of type 'X'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1319949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319949</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Fri, 06 Jul 2007 19:49:20 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 19:51:38 GMT]]></title><description><![CDATA[<p>Der Thread ist alt. Vermutlich war das noch mit vc6 gemacht. vc hat eine Erweiterung, die es erlaubt, rvalues auch an non-const Referenzen zu binden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319952</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 06 Jul 2007 19:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 20:52:48 GMT]]></title><description><![CDATA[<p>Muss ich wirklich über self() gehen? Gibt es nicht eine weniger aufdringliche Variante? Wie problematisch wäre es, einfach auf den verbreiteten Compiler-Bug zu vertrauen, dass mein Code geht? (GCC 4.3 hat keine Probleme mit ihm.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319974</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Fri, 06 Jul 2007 20:52:48 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 21:41:08 GMT]]></title><description><![CDATA[<p>Undefined Behaviour in Kauf nehmen!?<br />
Was kommt danach? Gutheißen von Angriffskriegen und Rechtsextremismus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320002</guid><dc:creator><![CDATA[kenner der dummköpfe]]></dc:creator><pubDate>Fri, 06 Jul 2007 21:41:08 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Fri, 06 Jul 2007 21:46:06 GMT]]></title><description><![CDATA[<p>kenner der dummköpfe schrieb:</p>
<blockquote>
<p>Undefined Behaviour in Kauf nehmen!?<br />
Was kommt danach? Gutheißen von Angriffskriegen und Rechtsextremismus?</p>
</blockquote>
<p><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="😃"
    /> <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/1320006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320006</guid><dc:creator><![CDATA[:live:]]></dc:creator><pubDate>Fri, 06 Jul 2007 21:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Sat, 07 Jul 2007 04:14:31 GMT]]></title><description><![CDATA[<p>Mr. N schrieb:</p>
<blockquote>
<p>Muss ich wirklich über self() gehen? Gibt es nicht eine weniger aufdringliche Variante? Wie problematisch wäre es, einfach auf den verbreiteten Compiler-Bug zu vertrauen, dass mein Code geht? (GCC 4.3 hat keine Probleme mit ihm.)</p>
</blockquote>
<p>Wenns portabel sein soll schon.<br />
Für MSVC alleine brauchst du IIRC nichtmal den &quot;operator xyz&amp;&quot;, das ist ne &quot;non-std-extension&quot; (MSVC verweigert es auch wenn man die &quot;non-std-extension&quot; ausschaltet).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320044</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 07 Jul 2007 04:14:31 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Sat, 07 Jul 2007 05:37:41 GMT]]></title><description><![CDATA[<p>reicht dir vielleicht sowas?</p>
<pre><code class="language-cpp">template&lt;class T&gt; struct ConstHelper
{
   typedef int type;
};

template&lt;class T&gt; struct ConstHelper&lt;T const&gt;
{
   template&lt;class U&gt; struct error {};
   typedef typename error&lt;T&gt;::type type;
};

template&lt;class T&gt;
T&amp; mutate_safely(T const&amp; x)
{
   return const_cast&lt;T&amp;&gt;(x);
}

template&lt;class T&gt;
T&amp; mutate_safely(T&amp; x, typename ConstHelper&lt;T&gt;::type = 0)
{
   return x;
}
//...
void foo (int&amp;);
foo (mutate_safely(42));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1320050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320050</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sat, 07 Jul 2007 05:37:41 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Sat, 07 Jul 2007 05:50:31 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>reicht dir vielleicht sowas?</p>
<pre><code class="language-cpp">template&lt;class T&gt; struct ConstHelper
{
   typedef int type;
};

template&lt;class T&gt; struct ConstHelper&lt;T const&gt;
{
   template&lt;class U&gt; struct error {};
   typedef typename error&lt;T&gt;::type type;
};

template&lt;class T&gt;
T&amp; mutate_safely(T const&amp; x)
{
   return const_cast&lt;T&amp;&gt;(x);
}

template&lt;class T&gt;
T&amp; mutate_safely(T&amp; x, typename ConstHelper&lt;T&gt;::type = 0)
{
   return x;
}
//...
void foo (int&amp;);
foo (mutate_safely(42));
</code></pre>
</blockquote>
<p>Das ist auch nur undefiniert auf einem höheren Level. Bei dieser Mine verlierst du nicht bloß den Fuß sondern gleich das ganze Bein. Nebenbei bemerkt, werden auch const-lvalues von der ersten Überladung konsumiert und nicht von der zweiten (1. weil diese spezieller ist und 2. weil die zweite Überladung dann dank SFINAE herausfällt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320053</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 07 Jul 2007 05:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Umgehung des const-Referenz-Status von Temporaries on Sat, 07 Jul 2007 14:04:14 GMT]]></title><description><![CDATA[<p>Ich hab mal einen Bug gegen GCC berichtet:</p>
<p><a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32658" rel="nofollow">http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32658</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320234</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Sat, 07 Jul 2007 14:04:14 GMT</pubDate></item></channel></rss>