<?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[std::unique_ptr-Implementierung]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich brauche für das Implementieren meiner C++03-Bibliothek <code>std::unique_ptr</code> s (zumindest gestaltet es das wesentlich eleganter). Wie sich erahnen lässt sollte dabei noch immer die Kompatibilität zu C++03 bestehend bleiben, weswegen ich ihn mir selbst implementiere.</p>
<p>Meine Frage:<br />
<a href="http://www.cplusplus.com/reference/memory/unique_ptr/reset/" rel="nofollow">std::unique_ptr::reset</a> akzeptiert in der Array-Version keine Zeiger, die von <code>element_type</code> abgeleitet sind. Ich jedoch sehe auf Anhieb kein Problem damit, Zeiger auf abgeleitete Klassen zuzulassen, solange die Grösse die selbe ist. Übersehe ich etwas?</p>
<p>Gruss.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328649/std-unique_ptr-implementierung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 07:47:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328649.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 21 Oct 2014 13:33:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Thu, 23 Oct 2014 08:28:36 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich brauche für das Implementieren meiner C++03-Bibliothek <code>std::unique_ptr</code> s (zumindest gestaltet es das wesentlich eleganter). Wie sich erahnen lässt sollte dabei noch immer die Kompatibilität zu C++03 bestehend bleiben, weswegen ich ihn mir selbst implementiere.</p>
<p>Meine Frage:<br />
<a href="http://www.cplusplus.com/reference/memory/unique_ptr/reset/" rel="nofollow">std::unique_ptr::reset</a> akzeptiert in der Array-Version keine Zeiger, die von <code>element_type</code> abgeleitet sind. Ich jedoch sehe auf Anhieb kein Problem damit, Zeiger auf abgeleitete Klassen zuzulassen, solange die Grösse die selbe ist. Übersehe ich etwas?</p>
<p>Gruss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423133</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 23 Oct 2014 08:28:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Tue, 21 Oct 2014 13:38:41 GMT]]></title><description><![CDATA[<p>hast du das beachtet?</p>
<pre><code>The specialization of unique_ptr for array objects with runtime length (unique_ptr&lt;T[],D&gt;) does not accept pointers to types derived from element_type as argument. An additional signature is provided in this case for null pointers:
void reset (nullptr_t p) noexcept;
</code></pre>
<p>steht<br />
<a href="http://www.cplusplus.com/reference/memory/unique_ptr/reset/" rel="nofollow">http://www.cplusplus.com/reference/memory/unique_ptr/reset/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423136</guid><dc:creator><![CDATA[HalliHallo]]></dc:creator><pubDate>Tue, 21 Oct 2014 13:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Tue, 21 Oct 2014 13:46:09 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>Hallo.</p>
<p>Ich brauche für das Implementieren meiner C++03-Bibliothek <code>std::unique_ptr</code> s (zumindest gestaltet es das wesentlich eleganter). Wie sich erahnen lässt sollte dabei noch immer die Kompatibilität zu C++03 bestehend bleiben, weswegen ich ihn mir selbst implementiere.</p>
</blockquote>
<p>Spontan würde ich sagen: ohne rvalue-Referenzen geht das nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423138</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 21 Oct 2014 13:46:09 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Tue, 21 Oct 2014 13:57:54 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>asfdlol schrieb:</p>
<blockquote>
<p>Hallo.</p>
<p>Ich brauche für das Implementieren meiner C++03-Bibliothek <code>std::unique_ptr</code> s (zumindest gestaltet es das wesentlich eleganter). Wie sich erahnen lässt sollte dabei noch immer die Kompatibilität zu C++03 bestehend bleiben, weswegen ich ihn mir selbst implementiere.</p>
</blockquote>
<p>Spontan würde ich sagen: ohne rvalue-Referenzen geht das nicht</p>
</blockquote>
<p>Klar, siehe boost.move.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423140</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Tue, 21 Oct 2014 13:57:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Tue, 21 Oct 2014 14:16:28 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>asfdlol schrieb:</p>
<blockquote>
<p>Hallo.</p>
<p>Ich brauche für das Implementieren meiner C++03-Bibliothek <code>std::unique_ptr</code> s (zumindest gestaltet es das wesentlich eleganter). Wie sich erahnen lässt sollte dabei noch immer die Kompatibilität zu C++03 bestehend bleiben, weswegen ich ihn mir selbst implementiere.</p>
</blockquote>
<p>Spontan würde ich sagen: ohne rvalue-Referenzen geht das nicht</p>
</blockquote>
<p>Klar, siehe boost.move.</p>
</blockquote>
<p>Interessant!</p>
<p>Und es gibt schon einen fertigen unique_ptr in boost ...<br />
Oder hier <a href="https://github.com/helloworld922/unique_ptr" rel="nofollow">https://github.com/helloworld922/unique_ptr</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423147</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 21 Oct 2014 14:16:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Thu, 23 Oct 2014 08:28:44 GMT]]></title><description><![CDATA[<p>HalliHallo schrieb:</p>
<blockquote>
<p>hast du das beachtet?</p>
</blockquote>
<p>Hast du den OP gelesen? Ich hab ja genau nach dem Sinn dahinter gefragt und ob man das nicht ein wenig lockern kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423488</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 23 Oct 2014 08:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Thu, 23 Oct 2014 10:27:29 GMT]]></title><description><![CDATA[<p>@asfdlol<br />
<code>T*</code> und <code>U*</code> sind nicht verwandt, nichtmal wenn <code>T</code> und <code>U</code> verwandt sind.<br />
Genau so sind <code>T[42]</code> und <code>U[42]</code> nicht verwandt, auch wenn <code>T</code> und <code>U</code> verwandt sind.<br />
Das ist der Grund.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423528</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 23 Oct 2014 10:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Thu, 23 Oct 2014 11:01:07 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><code>T*</code> und <code>U*</code> sind nicht verwandt, nichtmal wenn <code>T</code> und <code>U</code> verwandt sind.</p>
</blockquote>
<p><code>U*</code> ist in <code>T*</code> konvertierbar wenn <code>U</code> von <code>T</code> abgeleitet ist (sorry, ich verstehe nicht ganz was du mit &quot;verwandt&quot; meinst). Und infolgedessen funktioniert auch <code>std::unique_ptr&lt;Base&gt; Ptr(new Derived);</code> .</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Genau so sind <code>T[42]</code> und <code>U[42]</code> nicht verwandt, auch wenn <code>T</code> und <code>U</code> verwandt sind.</p>
</blockquote>
<p>Aber man könnte <code>U[42]</code> mit einem <code>T*</code> wie ein <code>T[42]</code> benutzen, sofern <code>U</code> von <code>T</code> abgeleitet und gleich gross ist, was aber von der Standardbibliothek nicht erlaubt wird. Und wieso das explizit verboten wird obwohl es meiner Einsicht nach Sinn macht ist der Kern meiner Frage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423540</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 23 Oct 2014 11:01:07 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Thu, 23 Oct 2014 11:46:51 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>Aber man könnte <code>U[42]</code> mit einem <code>T*</code> wie ein <code>T[42]</code> benutzen, sofern <code>U</code> von <code>T</code> abgeleitet und gleich gross ist [...]</p>
</blockquote>
<p>Nope, da liegt dein Denkfehler, das kann man nicht machen (das wäre undefiniertes Verhalten). Dass ein Array implizit in einen Pointer auf das erste Element umgewandelt werden kann und ein U* implizit in einen T* umgewandelt werden kann, heißt nicht, dass ein U* das selbe ist wie ein T* oder ein Array aus U das selbe ist wie ein Array aus T oder gar, dass ein Array aus U einfach so in einen U* und weiter in einen T* gewandelt werden kann und dieser dann auf das erste Element zeigt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423548</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 23 Oct 2014 11:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Thu, 23 Oct 2014 11:48:43 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Genau so sind <code>T[42]</code> und <code>U[42]</code> nicht verwandt, auch wenn <code>T</code> und <code>U</code> verwandt sind.</p>
</blockquote>
<p>Aber man könnte <code>U[42]</code> mit einem <code>T*</code> wie ein <code>T[42]</code> benutzen, sofern <code>U</code> von <code>T</code> abgeleitet und gleich gross ist, was aber von der Standardbibliothek nicht erlaubt wird. Und wieso das explizit verboten wird obwohl es meiner Einsicht nach Sinn macht ist der Kern meiner Frage.</p>
</blockquote>
<p>Vermutlich weil es gefährlich und ungewöhnlich ist. Um das zuzulassen, müsste auf jeden Fall ein eigener Deleter verwendet werden (man könnte vielleicht die Delete-Spezifikation so erweitern, dass sie signalisiert, ob mit abgeleiteten Typen gearbeitet werden kann - kannst du ja gerne dem Standardkomittee vorschlagen). Ungewöhnlich ist es deshalb, weil die Größe von Objekten (oder deren Gleichheit) typischerweise nicht die Basis von Designentscheidungen ist.</p>
<p>Ich bin nicht sicher ob die Verwendung von T[] als U[] unter den genannten Bedingungen in einer Umgebung zulässig ist, die &quot;strict pointer safety&quot; (3.7.4.3) implementiert. Bin mit diesem Teil des Standards nicht besonders vertraut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423553</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 23 Oct 2014 11:48:43 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Thu, 23 Oct 2014 12:22:49 GMT]]></title><description><![CDATA[<p>Ist es nicht eher das Problem, dass man Arrays nicht polymorphisch behandeln kann?<br />
Schließlich ist Pointerarithmetik statisch mit sizeof(elem_type).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423565</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 23 Oct 2014 12:22:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Thu, 23 Oct 2014 16:29:44 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p><code>T*</code> und <code>U*</code> sind nicht verwandt, nichtmal wenn <code>T</code> und <code>U</code> verwandt sind.</p>
</blockquote>
<p><code>U*</code> ist in <code>T*</code> konvertierbar wenn <code>U</code> von <code>T</code> abgeleitet ist (sorry, ich verstehe nicht ganz was du mit &quot;verwandt&quot; meinst). Und infolgedessen funktioniert auch <code>std::unique_ptr&lt;Base&gt; Ptr(new Derived);</code> .</p>
</blockquote>
<p>Ich verstehe nicht was es an &quot;nicht verwandt&quot; nicht zu verstehen gibt. Nicht verwandt halt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p><code>Base</code> und <code>Derived</code> sind verwandt, ja. Deswegen kann man <code>Derived*</code> zu <code>Base*</code> konvertieren.</p>
<p>Aber <code>Base*</code> und <code>Derived*</code> sind nicht verwandt. Deswegen kann man <code>Derived**</code> nicht zu <code>Base**</code> konvertieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423633</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 23 Oct 2014 16:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Fri, 24 Oct 2014 05:02:40 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Schließlich ist Pointerarithmetik statisch mit sizeof(elem_type).</p>
</blockquote>
<p>Das ist kein Problem, denn die Typen sind ja</p>
<p>asfdlol schrieb:</p>
<blockquote>
<p>gleich gross</p>
</blockquote>
<p>.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich verstehe nicht was es an &quot;nicht verwandt&quot; nicht zu verstehen gibt. Nicht verwandt halt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p><code>Base</code> und <code>Derived</code> sind verwandt, ja. Deswegen kann man <code>Derived*</code> zu <code>Base*</code> konvertieren.</p>
</blockquote>
<p>Ah, jetzt verstehe ich was du mit verwandt meinst (dass sie in einem polymorphen Verhältnis stehen). Sorry, hab mich unnötig dumm angestellt; ist eigentlich offensichtlich, dass das gemeint ist.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Aber <code>Base*</code> und <code>Derived*</code> sind nicht verwandt. Deswegen kann man <code>Derived**</code> nicht zu <code>Base**</code> konvertieren.</p>
</blockquote>
<p>Ja, das ergibt Sinn. Aber da diese Konvertierung ja nirgends benutzt wird (stets bloss <code>Derived*</code> zu <code>Base*</code> ), ist das irrelevant, oder? Oder möchtest du mir damit den Designfehler aufzeigen (wie als du vorhin gesagt hast, dass <code>T[n]</code> und <code>U[n]</code> nicht verwandt sind)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423737</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Fri, 24 Oct 2014 05:02:40 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr-Implementierung on Fri, 24 Oct 2014 12:00:27 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Aber <code>Base*</code> und <code>Derived*</code> sind nicht verwandt. Deswegen kann man <code>Derived**</code> nicht zu <code>Base**</code> konvertieren.</p>
</blockquote>
<p>Ja, das ergibt Sinn. Aber da diese Konvertierung ja nirgends benutzt wird (stets bloss <code>Derived*</code> zu <code>Base*</code> ), ist das irrelevant, oder?</p>
</blockquote>
<p>Naja nö, es würde <code>Derived(*)[N]</code> in <code>Base(*)[N]</code> konvertiert. Und das geht halt auch net.</p>
<pre><code>error: cannot convert ‘Derived (*)[10]’ to ‘Base (*)[10]’ in assignment
  bp = dp;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2423820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423820</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 24 Oct 2014 12:00:27 GMT</pubDate></item></channel></rss>