<?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[boost::shared_ptr kein Konvertierungsoperator]]></title><description><![CDATA[<p>Hallo.</p>
<p>Wieso hat <code>boost::shared_ptr&lt;T&gt;</code> keinen Konvertierungsoperator <code>T*</code> ?<br />
Gibt es dafür einen Grund?</p>
<p>bb</p>
<p>edit:<br />
Und ist das eine ausreichende Lösung?</p>
<pre><code class="language-cpp">struct pointer : boost::shared_ptr&lt;user&gt;
{
	pointer() {}
	explicit pointer(user* x) : boost::shared_ptr&lt;user&gt;(x) {}

	operator user*()
	{
		return get();
	}
	operator const user*() const
	{
		return get();
	}
};
</code></pre>
<p>Oder stell ich mir so irgendwie nen Bein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270231/boost-shared_ptr-kein-konvertierungsoperator</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 10:12:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270231.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Jul 2010 15:51:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Thu, 08 Jul 2010 16:05:22 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Wieso hat <code>boost::shared_ptr&lt;T&gt;</code> keinen Konvertierungsoperator <code>T*</code> ?<br />
Gibt es dafür einen Grund?</p>
<p>bb</p>
<p>edit:<br />
Und ist das eine ausreichende Lösung?</p>
<pre><code class="language-cpp">struct pointer : boost::shared_ptr&lt;user&gt;
{
	pointer() {}
	explicit pointer(user* x) : boost::shared_ptr&lt;user&gt;(x) {}

	operator user*()
	{
		return get();
	}
	operator const user*() const
	{
		return get();
	}
};
</code></pre>
<p>Oder stell ich mir so irgendwie nen Bein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923387</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 08 Jul 2010 16:05:22 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Thu, 08 Jul 2010 16:09:40 GMT]]></title><description><![CDATA[<p>Hi unskilled,</p>
<p><a href="http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm" rel="nofollow">http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm</a></p>
<p>Da steht doch, dass er einen hat...</p>
<pre><code class="language-cpp">T &amp; operator*() const; // never throws
</code></pre>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923394</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 08 Jul 2010 16:09:40 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Thu, 08 Jul 2010 16:19:41 GMT]]></title><description><![CDATA[<p>Nein.<br />
Das ist der Dereferenzierungs-Operator... ;o)<br />
Und überall &amp;*the_pointer schreiben zu müssen... ne...^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923398</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 08 Jul 2010 16:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Thu, 08 Jul 2010 16:31:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Q. Why doesn't shared_ptr (or any of the other Boost smart pointers) supply an automatic conversion to T*?</p>
<p>A. Automatic conversion is believed to be too error prone.</p>
</blockquote>
<p>Ist ja leider ein Nachteil der Kovertierungsoperatoren, das oft auch unerwünschte Konvertierungen möglich sind. Mit C++0x und <code>explicit</code> wird das sicher besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923404</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Thu, 08 Jul 2010 16:31:09 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Thu, 08 Jul 2010 16:37:55 GMT]]></title><description><![CDATA[<p>Mit normalen Zeigern und shared_ptr auf das selbe Objekte kann man ne Menge Blödsinn anstellen. Wenn Du z.B. mit so einem Konvertierungsoperator kurz einen normalen Zeiger hast und damit wieder in einen shared_ptr gehst, hast du 2 Referenzzähler und zwei deletes. Klar, wenn man ein bischen aufpasst, passiert sowas nicht, aber ein get() zwingt dich ein bischen mehr aufzupassen. Daher finde ich das eigentlich ganz gut so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923411</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Thu, 08 Jul 2010 16:37:55 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Thu, 08 Jul 2010 17:08:42 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<blockquote>
<p>Q. Why doesn't shared_ptr (or any of the other Boost smart pointers) supply an automatic conversion to T*?</p>
<p>A. Automatic conversion is believed to be too error prone.</p>
</blockquote>
<p>Ist ja leider ein Nachteil der Kovertierungsoperatoren, das oft auch unerwünschte Konvertierungen möglich sind. Mit C++0x und <code>explicit</code> wird das sicher besser.</p>
</blockquote>
<p>k, ty<br />
ob das jetzt wirklich ne fehlerquelle ist... wage ich mal zu bezweifeln - aber ok... ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923430</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 08 Jul 2010 17:08:42 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Thu, 08 Jul 2010 17:42:29 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Und überall &amp;*the_pointer schreiben zu müssen... ne...^^</p>
</blockquote>
<p>Jetzt nochmal eine theoretische Frage...<br />
Du möchtest dir ja das &amp;* sparen.</p>
<p>Jetzt hab ich mich gerade gefragt, was passiert denn, wenn ich in<br />
Templates ein &amp;* verwende, damit ich sie auf normale Zeiger und shared-Pointer<br />
anwenden kann, hab ich wenn mein Zeiger 0 ist, undefiniertes Verhalten<br />
oder ist das noch ok, weil ich auf die Speicherstelle nicht zugreife?</p>
<p>Ansonsten kann man natürlich eine Funktion aufrufen, die unterschiedlich für<br />
normale Zeiger und shared_ptr definiert ist.</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923453</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 08 Jul 2010 17:42:29 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Thu, 08 Jul 2010 23:58:03 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Jetzt hab ich mich gerade gefragt, was passiert denn, wenn ich in<br />
Templates ein &amp;* verwende, damit ich sie auf normale Zeiger und shared-Pointer<br />
anwenden kann, hab ich wenn mein Zeiger 0 ist, undefiniertes Verhalten<br />
oder ist das noch ok, weil ich auf die Speicherstelle nicht zugreife?</p>
</blockquote>
<p>Prinzipiell schon. Ich denke aber, im Release-Mode wird es wegoptimiert werden und nur im Debug-Mode krachts(vermutlich die assertion davor im op* des smart_ptrs)</p>
<blockquote>
<p>Ansonsten kann man natürlich eine Funktion aufrufen, die unterschiedlich für normale Zeiger und shared_ptr definiert ist.</p>
</blockquote>
<p>Ja, eben - man hat wieder mehraufwand.<br />
Oftmals interessiert es ja auch gar nicht, welche Art von pointer man verwendet, weil eine factory oder so dahintersteht, die nur ein pointer-typedef hat...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923627</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 08 Jul 2010 23:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Thu, 08 Jul 2010 23:59:19 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>ipsec schrieb:</p>
<blockquote>
<blockquote>
<p>Q. Why doesn't shared_ptr (or any of the other Boost smart pointers) supply an automatic conversion to T*?</p>
<p>A. Automatic conversion is believed to be too error prone.</p>
</blockquote>
<p>Ist ja leider ein Nachteil der Kovertierungsoperatoren, das oft auch unerwünschte Konvertierungen möglich sind. Mit C++0x und <code>explicit</code> wird das sicher besser.</p>
</blockquote>
<p>k, ty<br />
ob das jetzt wirklich ne fehlerquelle ist... wage ich mal zu bezweifeln - aber ok... ^^</p>
<p>bb</p>
</blockquote>
<p>Man könnte auch einfach davon ausgehen dass die grossen Jungs in dem Fall gewusste haben was sie da tun <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>Mir fällt zwar auf die Schnelle jetzt kein Beispiel ein wo es ein Problem machen würde, aber rein intuitiv finde ich es richtig so wie es ist.<br />
Gäbe es eine implizite Konvertierung hätte ich ein mords ungutes Gefühl dabei, und hätte shared_ptr vermutlich nicht so schnell akzeptiert.</p>
<p>Ich würde dir auch raten keine wie von dir skizzierte Hilfsklasse zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923628</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 08 Jul 2010 23:59:19 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Fri, 09 Jul 2010 00:21:08 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich würde dir auch raten keine wie von dir skizzierte Hilfsklasse zu schreiben.</p>
</blockquote>
<p>Also den Code so zu ändern, dass ich als Nutzer meiner Klasse dann davon ausgehen kann, dass es ein smart_ptr bleibt, der eine Methode <code>T* get() const</code> anbietet!?</p>
<p>Ich mag so etwas aber:</p>
<pre><code class="language-cpp">struct user
{
  struct pointer : boost::shared_ptr&lt;user&gt;
  {
    pointer() {}
    explicit pointer(user* x) : boost::shared_ptr&lt;user&gt;(x) {}

    operator user*()
    {
      return get();
    }
    operator const user*() const
    {
      return get();
    }
  };

  static const pointer bad_user;
  static pointer login(user::id_t user_id, const user::pwd_t&amp; password);
  static void logout(pointer to_logout);
/*...*/
};
</code></pre>
<p>wenn ich irgendwann denke: der smart_ptr ist zu teuer, weil... keine Ahung, kann ich einfach nen normalen Pointer draus machen(das logout gibts ja eh - das im exceptionfall, speicherlecks entstehen sollte dort nichts ausmachen) - oder einen anderen smart_ptr aus einer anderen bibliothek nehmen, der vll kein <code>get()</code> anbietet...</p>
<p>ich hab auch gerade mal versucht, unsinn mit dem konvertierungs-operator zu machen - ist mir aber nicht gelungen.<br />
es geht selbst nicht, noch einen smart_ptr um den gleichen ptr zu packen - außer mit casts, aber das ist ja schon boshaft. vor so etwas muss man sich imho nicht schützen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923634</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 09 Jul 2010 00:21:08 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Fri, 09 Jul 2010 07:41:21 GMT]]></title><description><![CDATA[<p>also das ist für mich überhaupt kein argument</p>
<ol>
<li>
<p>du wirst shared_ptr nicht so schnell gegen einen raw pointer tauschen können. schliesslich verwendet man shared_ptr nicht ohne grund. d.h. du müsstest sowieso viel ändern.</p>
</li>
<li>
<p>dein &quot;problem&quot; ist leicht ohne so eine fragwürdige hilfklasse zu umgehen.</p>
</li>
</ol>
<p>beispiel:</p>
<pre><code class="language-cpp">template &lt;class T&gt; T* get_pointer(T* p)
{
	return p;
}

template &lt;class T&gt; T* get_pointer(anderer_komischer_ptr&lt;T&gt; const&amp; p)
{
	return p.was_auch_immer();
}

void ifoo(int *p)
{
}

void foo(boost::shared_ptr&lt;int&gt; const&amp; sp)
{
	ifoo(get_pointer(sp));
}

void foo2(int* p)
{
	ifoo(get_pointer(p));
}

// ...
</code></pre>
<p>allgemein finde ich das die wesentlich schönere und sauberere lösung irgendwelche dinge die variieren können im eigenen programm austauschbar zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923704</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 09 Jul 2010 07:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kein Konvertierungsoperator on Fri, 09 Jul 2010 10:19:32 GMT]]></title><description><![CDATA[<p>so hatte ich es so gar zu erst - allerdings fand ichs hässlicher... -.-<br />
naja, danke trotzdem - auch, wenn ich wohl ein wenig zu stur bin <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/1923788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923788</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 09 Jul 2010 10:19:32 GMT</pubDate></item></channel></rss>