<?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[Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it]]></title><description><![CDATA[<p>Hallo,</p>
<p>derzeit habe ich immer sehr vereinfacht std::vector&lt;Klasse*&gt; myClass; genutzt. Bis mir jetzt mal aufgefallen ist das ich sehr oft vergesse den Speicher wieder frei zu geben ^^. Darum hab ich mir die smart-Pointer angeschaut und bin auch sehr zufrieden damit. Leider bin ich mir etwas unschlüssig bei einigen Dingen.</p>
<p>1. Wenn ich die/den map/vector mit</p>
<pre><code>for (auto &amp;it : myClass)
{
	// Geht
	it.second.get()-&gt;memberFunction();

	// Geht auch
	it.second-&gt;memberFunction();

	// Geht nicht
	auto myVariable = it.second;
	myVariable-&gt;memberFunction();
}
</code></pre>
<p>durchlaufe, muss ich dann wirklich it-&gt;second.get()-&gt;memberFunction() machen? Ich habe gesehen das selbst ohne das .get() es geht. Wenn ich aber vorher wie im Beispiel second in eine variable packe, geht es nicht mehr.</p>
<p>2. Wie heißt es denn nun richtig... <strong>const auto &amp;it</strong> oder <strong>auto const &amp;it</strong>? Ziehl soll es sein, nur lesend auf das Original Objekt zuzugreifen.</p>
<p>3. Um resourcen zu sparen, habe ich eine &quot;master&quot; std::map&lt;ObjectClass*&gt; MasterList in der Grundlegende Informationen enthalten sind. Diese habe ich nun auf std::map&lt;unique_ptr&lt;ObjectClass&gt;&gt; umgestellt.</p>
<p>Jetzt würde ich gern in einer anderen Klasse einen Pointer zu einem wert in dieser Liste setzen. Sprich, 2 Klassen verweisen auf das gleiche Objekt. Also muss ich doch nun einen shared_ptr verwenden oder? Und wenn ja, wie genau setzt man dann in der anderen Klasse den Verweis auf MasterList? Ich würde zuerst mit MasterListe.find() nach dem Objekt suchen. Aber was genau muss man danach machen um den Verweis zu speichern?</p>
<p>Danke für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333837/fragen-zu-unique_ptr-shared_ptr-const-auto-amp-it</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 08:58:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333837.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Aug 2015 07:08:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 07:20:50 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>derzeit habe ich immer sehr vereinfacht std::vector&lt;Klasse*&gt; myClass; genutzt. Bis mir jetzt mal aufgefallen ist das ich sehr oft vergesse den Speicher wieder frei zu geben ^^. Darum hab ich mir die smart-Pointer angeschaut und bin auch sehr zufrieden damit. Leider bin ich mir etwas unschlüssig bei einigen Dingen.</p>
<p>1. Wenn ich die/den map/vector mit</p>
<pre><code>for (auto &amp;it : myClass)
{
	// Geht
	it.second.get()-&gt;memberFunction();

	// Geht auch
	it.second-&gt;memberFunction();

	// Geht nicht
	auto myVariable = it.second;
	myVariable-&gt;memberFunction();
}
</code></pre>
<p>durchlaufe, muss ich dann wirklich it-&gt;second.get()-&gt;memberFunction() machen? Ich habe gesehen das selbst ohne das .get() es geht. Wenn ich aber vorher wie im Beispiel second in eine variable packe, geht es nicht mehr.</p>
<p>2. Wie heißt es denn nun richtig... <strong>const auto &amp;it</strong> oder <strong>auto const &amp;it</strong>? Ziehl soll es sein, nur lesend auf das Original Objekt zuzugreifen.</p>
<p>3. Um resourcen zu sparen, habe ich eine &quot;master&quot; std::map&lt;ObjectClass*&gt; MasterList in der Grundlegende Informationen enthalten sind. Diese habe ich nun auf std::map&lt;unique_ptr&lt;ObjectClass&gt;&gt; umgestellt.</p>
<p>Jetzt würde ich gern in einer anderen Klasse einen Pointer zu einem wert in dieser Liste setzen. Sprich, 2 Klassen verweisen auf das gleiche Objekt. Also muss ich doch nun einen shared_ptr verwenden oder? Und wenn ja, wie genau setzt man dann in der anderen Klasse den Verweis auf MasterList? Ich würde zuerst mit MasterListe.find() nach dem Objekt suchen. Aber was genau muss man danach machen um den Verweis zu speichern?</p>
<p>Danke für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462346</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Tue, 04 Aug 2015 07:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 07:37:06 GMT]]></title><description><![CDATA[<p>Zu 1: Was ist die Fehlermeldung?</p>
<p>zu 2: Ist äquivalent. Was man besser findet ist Geschmackssache.</p>
<p>zu 3: Einfach den shared_ptr kopieren oder zuweisen, so wie du es mit einem normalen Zeiger auch machen würdest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462347</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Tue, 04 Aug 2015 07:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 07:49:07 GMT]]></title><description><![CDATA[<p>MrSpoocy schrieb:</p>
<blockquote>
<p>geht es nicht mehr.</p>
</blockquote>
<p>Ich habe noch keinen Compiler gesehen, der als Fehlermeldung &quot;geht nicht&quot; ausgibt.<br />
Das Problem dürfte wohl auch &quot;auto myVariable = it.second;&quot; sein und nicht die Dereferenzierung. Du kannst eben keinen zweiten unique_ptr für den selben Speicherbereich verwenden.</p>
<p>MrSpoocy schrieb:</p>
<blockquote>
<p>2. Wie heißt es denn nun richtig... <strong>const auto &amp;it</strong> oder <strong>auto const &amp;it</strong>?</p>
</blockquote>
<p>Das ist egal.</p>
<p>MrSpoocy schrieb:</p>
<blockquote>
<p>Also muss ich doch nun einen shared_ptr verwenden oder?</p>
</blockquote>
<p>Nein. shared_ptr verwendet man, wenn der Letzte das Licht aus macht. Wenn die map auf jeden Fall solange existiert, wie der Zeiger in der anderen Klasse benötigt wird, verwendest du einen ganz normalen Pointer.<br />
Und was natürlich gar nicht geht ist zusätzlich zum unique_ptr einen shared_ptr zur Verwaltung des Speichers zu benutzen. Entweder Oder!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462348</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 04 Aug 2015 07:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 07:49:35 GMT]]></title><description><![CDATA[<p>zu 1.) Also ich habe gerade bemerkt das der Fehler...<br />
const std::_Simple_types&lt;...&gt;::value_type &amp;it</p>
<p>Fehler: Auf &quot;Funktion &quot;std::unique_ptr&lt;_Ty, _Dx&gt;::unique_ptr(const std::unique_ptr&lt;_Ty, _Dx&gt;::_Myt&amp;)...&quot; kann nicht verwiesen werden (ist eine gelöschte Funktion).</p>
<p>...nur dann auftritt wenn myClass vom type unique_ptr ist. Bei shared_ptr kommt der Fehler nicht. Ich denke es liegt daran das auto myVariable versucht eine kopie zu ertsellen welches nicht zulässig ist. Ich möchte aber auch gar keine Kopie haben sondern das Original benutzen. Da feht bestimmt wieder nur irgend ein dereferenzierung :(.</p>
<p>zu 3.) In der KlasseB würde ich also in der Header folgendes schreiben:</p>
<p>protected:<br />
std::shared_ptr&lt;Klasse&gt; basisKlasse;</p>
<p>und später im constructor:</p>
<pre><code>const auto &amp;it = myClass.find(id);
if (it != myClass.end())
{
	this-&gt;basisKlasse = (*it).second;
}
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462349</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Tue, 04 Aug 2015 07:49:35 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 07:59:47 GMT]]></title><description><![CDATA[<p>MrSpoocy schrieb:</p>
<blockquote>
<p>zu 1.) Also ich habe gerade bemerkt das der Fehler...<br />
const std::_Simple_types&lt;...&gt;::value_type &amp;it</p>
<p>Fehler: Auf &quot;Funktion &quot;std::unique_ptr&lt;_Ty, _Dx&gt;::unique_ptr(const std::unique_ptr&lt;_Ty, _Dx&gt;::_Myt&amp;)...&quot; kann nicht verwiesen werden (ist eine gelöschte Funktion).</p>
<p>...nur dann auftritt wenn myClass vom type unique_ptr ist. Bei shared_ptr kommt der Fehler nicht. Ich denke es liegt daran das auto myVariable versucht eine kopie zu ertsellen welches nicht zulässig ist. Ich möchte aber auch gar keine Kopie haben sondern das Original benutzen. Da feht bestimmt wieder nur irgend ein dereferenzierung :(.</p>
</blockquote>
<p>Nein, aber fast. Was fehlt, ist ein <code>&amp;</code> hinter dem <code>auto</code> . Lies mal die ersten Tipps in Scott Meyers Buch über die Type deduction von Templates, auto und decltype durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462352</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Tue, 04 Aug 2015 07:59:47 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 08:11:25 GMT]]></title><description><![CDATA[<p>Ok, also dann wieder unique_ptr und in KlasseB</p>
<pre><code>class KlasseB
{
protected: 
	Klasse *basisKlasse;

public:
	KlasseB(short id) {
		const auto &amp;it = myClass.find(nameID);
		if (it != myClass.end())
		{
			this-&gt;basisKlasse = it-&gt;second.get();
		}
	};
};
</code></pre>
<p>zu der for schleife, ich dachte das ich durch das &amp; im for schon sage das ich keine Kopie haben möchte sondern mit dem Original arbeite. Wird echt verwirrender mit den vielen * und &amp; <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/2462354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462354</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Tue, 04 Aug 2015 08:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 08:40:12 GMT]]></title><description><![CDATA[<p>Erst einmal würde ich dir empfehlen auto nur sparsam bis gar nicht einzusetzen, dann siehst du auch mit welchen Typen du umgehst.</p>
<p>Wenn du einen smart Pointer hast und auf das selbe Objekt einen normalen Pointer, dann ist prinzipiell das ganze smart Pointer Konzept hinfällig, da der normale Pointer nach wie vor ungültig werden kann.<br />
Das gilt besonders für unique_ptr. Wenn du einen einzigartigen Pointer haben willst, sollte er auch einzigartig bleiben. Wenn dem nicht so ist, nimm shared_ptr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462357</guid><dc:creator><![CDATA[coder777]]></dc:creator><pubDate>Tue, 04 Aug 2015 08:40:12 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 08:49:23 GMT]]></title><description><![CDATA[<p>coder777 schrieb:</p>
<blockquote>
<p>Erst einmal würde ich dir empfehlen auto nur sparsam bis gar nicht einzusetzen, dann siehst du auch mit welchen Typen du umgehst.</p>
</blockquote>
<p><a href="http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/" rel="nofollow">lol?</a></p>
<p>coder777 schrieb:</p>
<blockquote>
<p>Wenn du einen smart Pointer hast und auf das selbe Objekt einen normalen Pointer, dann ist prinzipiell das ganze smart Pointer Konzept hinfällig, da der normale Pointer nach wie vor ungültig werden kann.</p>
</blockquote>
<p>lol? (Das Konzept heisst Ownership und ist dadurch noch lange nicht hinfällig.)</p>
<p>coder777 schrieb:</p>
<blockquote>
<p>Das gilt besonders für unique_ptr. Wenn du einen einzigartigen Pointer haben willst, sollte er auch einzigartig bleiben. Wenn dem nicht so ist, nimm shared_ptr.</p>
</blockquote>
<p>lol? (So funktioniert Ownership nicht.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462360</guid><dc:creator><![CDATA[lolbot]]></dc:creator><pubDate>Tue, 04 Aug 2015 08:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 10:58:32 GMT]]></title><description><![CDATA[<p>lolbot schrieb:</p>
<blockquote>
<p>lol?</p>
</blockquote>
<p>Unsinn, ich rede von der Realität und nicht von dem, was Herb Sutter, Bjarne Stroustrup und Konsorten so gerne in ihren Elfenbeintürmen hallen lassen.</p>
<p>Was für ein Typ ist denn</p>
<pre><code>const auto &amp;it = myClass.find(nameID);
</code></pre>
<p>genau? map::iterator, map::const_iterator, map::herb_sutter_iterator?</p>
<p>Ich persönlich will selber über den Typ bestimmen und nicht irgend jemand anderen das machen lassen.</p>
<p>Für alle anderen, wie wär's mit folgender Idee:<br />
Wenn man über eine Variable 'hovered' und es ist ein auto erscheint neben dem Typ ein Bild von Herb Sutter vor dem Microsoft Logo mit Daumen nach oben.<br />
Wenn man die Classic Typisierung verwendet, sieht man eine Herb Sutter wie ein Pinguin zerreißt.</p>
<p>Scheinbar mag Herb Sutter viel lieber (warum bloß?) die butterweiche [Visual] Basic Typisierung.</p>
<blockquote>
<p>ol? (Das Konzept heisst Ownership und ist dadurch noch lange nicht hinfällig.)<br />
...<br />
lol? (So funktioniert Ownership nicht.)</p>
</blockquote>
<p>Du verstehst das Ownership-Prinzip wohl nicht so ganz.<br />
Für unique_ptr bedeutet Ownership lediglich, dass er am Ende seiner Lebenszeit im Destruktor das Objekt löscht.<br />
Gibt es einen zweiten Zeiger auf das Objekt mit längerer Lebenszeit, wird der zweite Zeiger dann ungültig.<br />
Wenn du <em>keine</em> unique_ptr hast und irgendwann delete aufrufst, kommt es zum selben Effekt.<br />
Mit anderen Worten: Ownership wird hinfällig / macht keinen Sinn mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462384</guid><dc:creator><![CDATA[coder777]]></dc:creator><pubDate>Tue, 04 Aug 2015 10:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 11:40:06 GMT]]></title><description><![CDATA[<p>MrSpoocy schrieb:</p>
<blockquote>
<pre><code>// Geht nicht
	auto myVariable = it.second;
</code></pre>
</blockquote>
<p>Was hier bei der Diskussion ein wenig untergeht ist, warum der Ausdruck da oben genau zu einem Fehler führt.<br />
Das liegt einfach daran, dass <code>std::unique_ptr</code> nicht &quot;kopierbar&quot; sondern lediglich &quot;Movable&quot; ist.<br />
Der Compiler macht aus dem obigen Audruck nämlich folgendes:</p>
<pre><code>unique_ptr&lt;ObjectClass&gt; myVariable = it.second;
</code></pre>
<p>Das funktioniert aber nicht, da Copy Constructor und Copy Assignment bei <code>std::unique_ptr</code> nicht gewollt sind,<br />
und daher aus gutem Grund explizit als gelöscht deklariert wurden.<br />
Im Code der Standardbibliothek sieht das wahrscheinlich so aus:</p>
<pre><code>template &lt;typename T&gt;
    class unique_ptr
    {
       ...
       unique_ptr(const unique_ptr&amp; other) = delete;
       unique_ptr&amp; operator=(const unique_ptr&amp; other) = delete;
       ...
    }
</code></pre>
<p>Möchte man den Inhalt eines <code>std::unique_ptr</code> in einem anderen haben, dann ist die einzige Möglichkeit diesen zu &quot;Moven&quot;:</p>
<pre><code>auto myVariable = std::move(it.second);
</code></pre>
<p>Das ist aber sicherlich nicht das was du möchtest (!), da du damit den Inhalt des Unique Pointer aus der Map &quot;herausziehst&quot;,<br />
und der Pointer in der Map anschließend NULL ist. Was du so wie ich das verstehe wirklich willst, ist auf das Objekt zugreifen,<br />
auf das der Unique Pointer verweist. Man könnte sich jetzt mithilfe von <code>auto</code> eine Referenz holen:</p>
<pre><code>auto&amp; myVariable = it.second; // wird zu unique_ptr&lt;ObjectClass&gt;&amp;
    const auto&amp; myVariable = it.second; // wird zu const unique_ptr&lt;ObjectClass&gt;&amp;
</code></pre>
<p>Man sollte sich hierbei allerdings klar darüber sein, dass man damit eine Referenz auf den <code>unique_ptr</code> bekommt,<br />
nicht jedoch auf das Objekt selbst. D.h. auch dass sich die <code>const</code> -Qualifikation im zweiten Ausdruck auf den <code>unique_ptr</code><br />
bezieht (konstanter Pointer auf nicht-konstantes Objekt).</p>
<p>MrSpoocy schrieb:</p>
<blockquote>
<p>Ziehl soll es sein, nur lesend auf das Original Objekt zuzugreifen.</p>
</blockquote>
<p>Nach all den Hintergrund-Infos jetzt das was du wahrscheilich <em>wirklich</em> willst:</p>
<pre><code>const auto&amp; myVariable = *it.second; // äquivalent zu *it.second.get(), wird zu const ObjectClass&amp;
    // oder alternativ, falls Pointer auch NULL sein kann:
    const auto myVariable = it.second.get(); // gibt dir einen const ObjectClass*
</code></pre>
<p>Hoffe das macht jetzt einiges klarer <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>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462388</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Tue, 04 Aug 2015 11:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 11:39:12 GMT]]></title><description><![CDATA[<p>coder777 schrieb:</p>
<blockquote>
<p>lolbot schrieb:</p>
<blockquote>
<p>lol?</p>
</blockquote>
<p>Unsinn, ich rede von der Realität und nicht von dem, was Herb Sutter, Bjarne Stroustrup und Konsorten so gerne in ihren Elfenbeintürmen hallen lassen.</p>
<p>Was für ein Typ ist denn</p>
<pre><code>const auto &amp;it = myClass.find(nameID);
</code></pre>
<p>genau? map::iterator, map::const_iterator, map::herb_sutter_iterator?</p>
</blockquote>
<p>Das hängt von der <code>myClass</code> ab. Wenn's eine <code>herb_sutter_map</code> ist, dann <code>map::herb_sutter_iterator</code> . Aber darauf kommt es hier auch gar nicht an. Vielmehr soll es ein Random Access Iterator sein, das ist entscheidend.</p>
<p>coder777 schrieb:</p>
<blockquote>
<p>Ich persönlich will selber über den Typ bestimmen und nicht irgend jemand anderen das machen lassen.</p>
</blockquote>
<p>Tust du ja, und es gibt durchaus Fälle, wo <code>auto</code> auch nicht zur Leserlichkeit des Codes beiträgt. Aber mit der Einstellung würdest du sicher auch</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void func(T t) { ... }

func&lt;int&gt;(4);
</code></pre>
<p>schreiben, nicht wahr? Die böse Template argument deduction macht dich sonst arbeitslos. <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>
<p>coder777 schrieb:</p>
<blockquote>
<p>Für alle anderen, wie wär's mit folgender Idee:<br />
[ blabla Bashing ... ]</p>
</blockquote>
<p>Kein Kommentar. Ist leider nicht lustig, sorry.</p>
<p>coder777 schrieb:</p>
<blockquote>
<blockquote>
<p>ol? (Das Konzept heisst Ownership und ist dadurch noch lange nicht hinfällig.)<br />
...<br />
lol? (So funktioniert Ownership nicht.)</p>
</blockquote>
<p>Du verstehst das Ownership-Prinzip wohl nicht so ganz.<br />
Für unique_ptr bedeutet Ownership lediglich, dass er am Ende seiner Lebenszeit im Destruktor das Objekt löscht.<br />
Gibt es einen zweiten Zeiger auf das Objekt mit längerer Lebenszeit, wird der zweite Zeiger dann ungültig.<br />
Wenn du <em>keine</em> unique_ptr hast und irgendwann delete aufrufst, kommt es zum selben Effekt.<br />
Mit anderen Worten: Ownership wird hinfällig / macht keinen Sinn mehr.</p>
</blockquote>
<p>Nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462389</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Tue, 04 Aug 2015 11:39:12 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 12:00:56 GMT]]></title><description><![CDATA[<p>Sorry für Ot.</p>
<p>coder777 schrieb:</p>
<blockquote>
<p>lolbot schrieb:</p>
<blockquote>
<p>lol?</p>
</blockquote>
<p>Unsinn, ich rede von der Realität und nicht von dem, was Herb Sutter, Bjarne Stroustrup und Konsorten so gerne in ihren Elfenbeintürmen hallen lassen.</p>
<p>Was für ein Typ ist denn</p>
<pre><code>const auto &amp;it = myClass.find(nameID);
</code></pre>
<p>genau? map::iterator, map::const_iterator, map::herb_sutter_iterator?</p>
</blockquote>
<p>Das ist vollkkommen wurscht. Es ist ein Iterator, du weißt, was du damit machen kannst. Es geht nur um das Konzept. Ich konnte std::async verwenden ohne den Returntypen zu kennen, ich wusste nur, dass get() mir den Wert liefert. Mehr muss ich nicht wissen.<br />
Und dieses &quot;Fehlen&quot; von Typinformationen, hat man als C++ Programmierer ständig:<br />
Jedesmal, wenn man ein Template schreibt, weiß man nicht, welchen Typen man hat.<br />
Jedesmal, wenn man einen Basisklassenzeiger hat, weiß man nicht, welchen Typen man hat.<br />
Jedesmal, wenn man eine API verwendet, die irgendeinen Handle Typen via Typedef versteckt, weiß man nicht, welchen Typen man hat.</p>
<p>Wenn man nicht programmieren kann, ohne Typen zu verwenden, programmiert man nicht ausreichend gegenüber Interfaces. Das Argument &quot;mimimi, ich will, aber wissen, wie meine Typen heißen&quot; kennzeichnet einen schlechten Programmierer - no offense. <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/2462394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462394</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 04 Aug 2015 12:00:56 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 12:09:20 GMT]]></title><description><![CDATA[<p>Ohne auto wird es oft auch gefährlich, wenn man den Rückgabetyp &quot;nur so ungefähr&quot; kennt. Da macht man dann möglicherweise ohne es zu wollen eine Typ-Konvertierung die unnötige Laufzeitkosten haben kann oder sogar fehlerhaft ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462397</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Tue, 04 Aug 2015 12:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 12:28:54 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29873">@Nathan</a>: Es gibt durchaus Situationen in denen <code>auto</code> suboptimal ist. Siehe auch N4035.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462399</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 04 Aug 2015 12:28:54 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 12:49:10 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29873">@Nathan</a>: Es gibt durchaus Situationen in denen <code>auto</code> suboptimal ist. Siehe auch N4035.</p>
</blockquote>
<p>Hab ich nicht abgestritten, ich verwende auch nicht AAA, bspw. bei <code>Foo foo;</code> o.Ä.<br />
Ich habe lediglich die Philosophie hinter auto verteidigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462402</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 04 Aug 2015 12:49:10 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Tue, 04 Aug 2015 14:08:32 GMT]]></title><description><![CDATA[<p>coder777 schrieb:</p>
<blockquote>
<p>Was für ein Typ ist denn</p>
<pre><code>const auto &amp;it = myClass.find(nameID);
</code></pre>
<p>genau? map::iterator, map::const_iterator, map::herb_sutter_iterator</p>
</blockquote>
<p>Du hast bei <code>map</code> die Template Parameter vergessen meintest wohl <code>std::map&lt;std::string, std::function&lt;void(int, int)&gt;::const_iterator</code> oder irgendwas anderes tolles. Wer solche Typen ausschreiben will ist selbst schuld...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462423</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Tue, 04 Aug 2015 14:08:32 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Wed, 05 Aug 2015 10:55:08 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>Vielmehr soll es ein Random Access Iterator sein, das ist entscheidend.</p>
</blockquote>
<p>Sicher, dir offenbaren sich die Geheimnisse von auto unmittelbar. Mir nicht. Ich bin dumm.</p>
<p>Jodocus schrieb:</p>
<blockquote>
<p>Aber mit der Einstellung würdest du sicher auch</p>
</blockquote>
<p>Selbstverständlich. Wenn ich das eine nicht tue, tue ich zwangsweise das andere.</p>
<p>Jodocus schrieb:</p>
<blockquote>
<p>Nein.</p>
</blockquote>
<p>Großartiges Argument. Hätte ich das doch schnon früher gwusst.</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>Mehr muss ich nicht wissen.</p>
</blockquote>
<p>Du bist ja auch ein guter Programmierer und ich ein schlechter. In meiner Welt kann jede Zeile ein Fehler enthalten (deswegen muss ich einfach genau wissen, was da passiert). Für dich ist das natürlich nicht relevant.</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>Und dieses &quot;Fehlen&quot; von Typinformationen, hat man als C++ Programmierer ständig:<br />
Jedesmal, wenn man ein Template schreibt, weiß man nicht, welchen Typen man hat.<br />
Jedesmal, wenn man einen Basisklassenzeiger hat, weiß man nicht, welchen Typen man hat.<br />
Jedesmal, wenn man eine API verwendet, die irgendeinen Handle Typen via Typedef versteckt, weiß man nicht, welchen Typen man hat.</p>
</blockquote>
<p>Ist das ein Argument für oder gegen irgendwas? Wenn man solche Dinger bekommt, muss man eben damit umgehen.</p>
<p>TNA schrieb:</p>
<blockquote>
<p>Ohne auto wird es oft auch gefährlich, wenn man den Rückgabetyp &quot;nur so ungefähr&quot; kennt. Da macht man dann möglicherweise ohne es zu wollen eine Typ-Konvertierung die unnötige Laufzeitkosten haben kann oder sogar fehlerhaft ist.</p>
</blockquote>
<p>Also gibt es Situationen, in denen nicht wissen besser ist. Wenn auto irgendwo besser ist als alles andere, sollte man es natürlich auch einsetzen.</p>
<p>sebi707 schrieb:</p>
<blockquote>
<p>Du hast bei map die Template Parameter vergessen meintest wohl std::map&lt;std::string, std::function&lt;void(int, int)&gt;::const_iterator oder irgendwas anderes tolles. Wer solche Typen ausschreiben will ist selbst schuld...</p>
</blockquote>
<p>Ganz genau. Hier ein Beispiel, wie ein schlechter Programmiere wie ich das macht:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;

struct buch
{
  std::string Autor;
};

using isbn_buch_map = std::map&lt;std::string, buch&gt;;
isbn_buch_map IsbnBuchMap;

int main()
{
  const isbn_buch_map::const_iterator it = IsbnBuchMap.begin(); // Womöglich würde ich auch noch isbn_buch_it schreiben...
  for(const isbn_buch_map::value_type &amp;isbn_buch : IsbnBuchMap)
  {
    std::string isbn = isbn_buch.first;
    std::string autor = isbn_buch.second.Autor;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2462617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462617</guid><dc:creator><![CDATA[coder777]]></dc:creator><pubDate>Wed, 05 Aug 2015 10:55:08 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Wed, 05 Aug 2015 11:30:08 GMT]]></title><description><![CDATA[<p>coder777 schrieb:</p>
<blockquote>
<p>Jodocus schrieb:</p>
<blockquote>
<p>Vielmehr soll es ein Random Access Iterator sein, das ist entscheidend.</p>
</blockquote>
<p>Sicher, dir offenbaren sich die Geheimnisse von auto unmittelbar. Mir nicht. Ich bin dumm.</p>
</blockquote>
<p>Du brauchst jetzt gar nicht die beleidigte Leberwurst zu spielen. Hier hat niemand dich, sondern deine Argumente angegriffen.</p>
<p>coder777 schrieb:</p>
<blockquote>
<p>Jodocus schrieb:</p>
<blockquote>
<p>Aber mit der Einstellung würdest du sicher auch</p>
</blockquote>
<p>Selbstverständlich. Wenn ich das eine nicht tue, tue ich zwangsweise das andere.</p>
</blockquote>
<p>Also bist du inkonsequent. Die Typenauflösung von auto und Template-Parametern unterscheiden sich nur marginal (initializer list syntax). Dein Argument, du hättest keine Kontrolle über den Typen greift aber auch für die Template argument deduction. Wie rettest du dich nun aus der Doppelmoral, die template argument deduction benutzen zu dürfen, nicht aber die auto deduction, die semantisch fast 100%tig identisch ist?</p>
<p>coder777 schrieb:</p>
<blockquote>
<p>Jodocus schrieb:</p>
<blockquote>
<p>Nein.</p>
</blockquote>
<p>Großartiges Argument. Hätte ich das doch schnon früher gwusst.</p>
</blockquote>
<p>Ich ging darauf nicht weiter ein, da dein logischer Schluss, dass das Ownership-Prinzip hinfällig wäre, nur weil es dangling references geben könnte, widersinnig ist. Wenn du einem Freund dein Auto kurz ausleihst, darf er damit fahren, aber er darf es nicht zerstören. Wenn du dein Auto vorher kaputt machst und ihm danach gibst, bist du ja ein toller Freund; sowas macht man nicht! Aber nur weil du dein Auto ausgeliehen hast, heißt das noch lange nicht, dass das Konzept von Besitz hinfällig wäre.<br />
Einen rohen Pointer auf eine Ressource zu bekommen, die einem Smart Pointer gehört, ist so etwas wie ausleihen. Wenn man das macht, muss man vorsichtig sein und einen guten Grund dafür haben. Wie immer, wo es dangling references geben kann.</p>
<p>code777 schrieb:</p>
<blockquote>
<p>Ganz genau. Hier ein Beispiel, wie ein schlechter Programmiere wie ich das macht:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;

struct buch
{
  std::string Autor;
};

using isbn_buch_map = std::map&lt;std::string, buch&gt;;
isbn_buch_map IsbnBuchMap;

int main()
{
  const isbn_buch_map::const_iterator it = IsbnBuchMap.begin(); // Womöglich würde ich auch noch isbn_buch_it schreiben...
  for(const isbn_buch_map::value_type &amp;isbn_buch : IsbnBuchMap)
  {
    std::string isbn = isbn_buch.first;
    std::string autor = isbn_buch.second.Autor;
  }
}
</code></pre>
</blockquote>
<p>Ja, und im Real-World-Code hast du dann ein 100-Zeilen using/typedef-Präambel. Und wenn du später mal willst, dass z.B. bei jedem Iterator-Zugriff geloggt werden soll, musst du manuell überall die Typen auf logged_iterator ändern, obwohl dem Code, der den Typen benutzt, es völlig egal ist, was für ein Iterator das ist, solange er das Konzept eines Iterators erfüllt.</p>
<p>Nach deiner Logik sind Templates absolutes Tabu. Falls nicht, dann hast du eine Doppelmoral. Either way, du hast dich in eine Sackgasse manövriert. Du brauchst gar nicht zu versuchen, dich darin zu rechtfertigen. Es ist Unsinn. So funktioniert C++ nun mal nicht. Und falls du das wieder persönlich nehmen solltest, so ist das nicht persönlich gemeint. Lies mal Effective Modern C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462624</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Wed, 05 Aug 2015 11:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu unique_ptr, shared_ptr, const auto &amp;amp;it on Wed, 05 Aug 2015 18:57:07 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>coder777 schrieb:</p>
<blockquote>
<p>Jodocus schrieb:</p>
<blockquote>
<p>Aber mit der Einstellung würdest du sicher auch</p>
</blockquote>
<p>Selbstverständlich. Wenn ich das eine nicht tue, tue ich zwangsweise das andere.</p>
</blockquote>
<p>Also bist du inkonsequent. Die Typenauflösung von auto und Template-Parametern unterscheiden sich nur marginal (initializer list syntax). Dein Argument, du hättest keine Kontrolle über den Typen greift aber auch für die Template argument deduction. Wie rettest du dich nun aus der Doppelmoral, die template argument deduction benutzen zu dürfen, nicht aber die auto deduction, die semantisch fast 100%tig identisch ist?</p>
</blockquote>
<p>Schlimmer noch! Wenn man auto in der Form <code>auto f = foo();</code> verwendet, kann man wenigstens noch rauskriegen was f ist, indem man sich foo() anschaut. Beim Schreiben von Templates kann man nicht rauskriegen, was sein Typ ist.</p>
<p>@coder777: Lies einfach das gotw hier, Sutter kann besser argumentieren als ich: <a href="http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/" rel="nofollow">http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462694</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 05 Aug 2015 18:57:07 GMT</pubDate></item></channel></rss>