<?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[facebook releases Folly, an open source C++ library]]></title><description><![CDATA[<p><a href="https://github.com/facebook/folly/blob/master/folly/docs/Overview.md" rel="nofollow">https://github.com/facebook/folly/blob/master/folly/docs/Overview.md</a></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304305/facebook-releases-folly-an-open-source-c-library</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 20:56:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304305.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 03 Jun 2012 11:05:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 11:05:51 GMT]]></title><description><![CDATA[<p><a href="https://github.com/facebook/folly/blob/master/folly/docs/Overview.md" rel="nofollow">https://github.com/facebook/folly/blob/master/folly/docs/Overview.md</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218797</guid><dc:creator><![CDATA[xDD]]></dc:creator><pubDate>Sun, 03 Jun 2012 11:05:51 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 12:43:51 GMT]]></title><description><![CDATA[<p>Wow, das sieht auf den ersten Blick ziemlich vielversprechend aus. Laut Header-Kommentaren hat da zum großen Teil Andrei Alexandrescu seine Finger mit im Spiel gehabt. Nur warum veröffentlicht Facebook das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218840</guid><dc:creator><![CDATA[Bloops]]></dc:creator><pubDate>Sun, 03 Jun 2012 12:43:51 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 12:46:41 GMT]]></title><description><![CDATA[<p>Bloops schrieb:</p>
<blockquote>
<p>Wow, das sieht auf den ersten Blick ziemlich vielversprechend aus. Laut Header-Kommentaren hat da zum großen Teil Andrei Alexandrescu seine Finger mit im Spiel gehabt. Nur warum veröffentlicht Facebook das?</p>
</blockquote>
<p>Dann haben sie ihm bestimmt genötigt <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2218841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218841</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sun, 03 Jun 2012 12:46:41 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 16:39:13 GMT]]></title><description><![CDATA[<p>browse da gerade so drüber und bin über folgendes gestoplert:</p>
<pre><code class="language-cpp">template &lt;typename... Types&gt;
class DiscriminatedPtr {

  ...

  /**
   * Get a pointer to the object that this DiscriminatedPtr points to, if it is
   * of type T.  Fails at compile time if T is not a valid type (listed in
   * Types), and returns nullptr if this DiscriminatedPtr is empty or points to
   * an object of a different type.
   */
  template &lt;typename T&gt;
  T* get_nothrow() noexcept ...

  template &lt;typename T&gt;
  const T* get_nothrow() const noexcept ...

  /**
   * Get a pointer to the object that this DiscriminatedPtr points to, if it is
   * of type T.  Fails at compile time if T is not a valid type (listed in
   * Types), and throws std::invalid_argument if this DiscriminatedPtr is empty
   * or points to an object of a different type.
   */
  template &lt;typename T&gt;
  T* get() ...

  template &lt;typename T&gt;
  const T* get() const ...

  ...

};
</code></pre>
<p>Da hat scheinbar jemand &quot;const&quot; nicht ganz verstanden; denn &quot;const T*&quot; bringt absolut gar nichts, da man den Zeiger ja kopieren kann:</p>
<pre><code class="language-cpp">void foo(DiscriminatedPtr&lt;int,double&gt; const&amp; x)
{
  x.get_nothrow&lt;int&gt;(); // --&gt; const int*
  auto y = x;
  y.get_nothrow&lt;int&gt;(); // --&gt; int*
}
</code></pre>
<p>Ich hätte das so gebaut:</p>
<pre><code class="language-cpp">template &lt;typename... Types&gt;
class DiscriminatedPtr {

  ...

  template &lt;typename T&gt;
  T* get_nothrow() const noexcept ...

  template &lt;typename T&gt;
  T* get() const ...

  ...

};
</code></pre>
<p>Also mit const-Methoden, die T* zurück geben. Das passt dann auch zum Verhalten von rohen Zeigern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218904</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 03 Jun 2012 16:39:13 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 16:40:45 GMT]]></title><description><![CDATA[<p>It's open source fix it!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218905</guid><dc:creator><![CDATA[Then Fix It!]]></dc:creator><pubDate>Sun, 03 Jun 2012 16:40:45 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 16:59:57 GMT]]></title><description><![CDATA[<p>krümelkacker, du hast da was falsch verstanden in Bezug auf const und Zeiger.</p>
<pre><code class="language-cpp">const T * foo; // foo ist ein Zeiger auf ein konstantes T
T const * foo; // selbiges

T * const foo; // konstanter Zeiger auf variables foo

const T * const foo; // konstanter Zeiger auf konstantes foo
T const * const foo; // selbiges
</code></pre>
<p>Du siehst also, dass die Methoden keine konstanten Zeiger zurückgeben,<br />
sondern normale Zeiger auf konstante Objekte, und da bekommt man das const in C++ nur mit const_cast oder C-Style-Cast weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218911</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Sun, 03 Jun 2012 16:59:57 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 17:00:47 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Da hat scheinbar jemand &quot;const&quot; nicht ganz verstanden; denn &quot;const T*&quot; bringt absolut gar nichts, da man den Zeiger ja kopieren kann:</p>
</blockquote>
<p>Kannst Du das ein wenig genauer erläutern. Ich scheine &quot;const&quot; auch nicht ganz verstanden zu haben <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>Ein &quot;const T*&quot; ist ein Zeiger auf ein Objekt, welches ich nicht modifizieren kann. Über den &quot;const T*&quot; kann ich nur Methoden aufrufen, die const sind. Ein &quot;const T*&quot; kann ich zwar kopieren, aber nicht auf einen &quot;T*&quot; sondern nur auf einen anderen &quot;const T*&quot;. Da gilt die Restriktion genau so.</p>
<p>In Deinem Beispiel ist x eine konstante Referenz. Eine konstante Referenz kann ich auch nur einer Konstanten Referenz zuweisen. Also ist y in der Zeile &quot;auto y = x&quot; auch eine konstante Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218912</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Sun, 03 Jun 2012 17:00:47 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 09:00:26 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Da hat scheinbar jemand &quot;const&quot; nicht ganz verstanden; denn &quot;const T*&quot; bringt absolut gar nichts, da man den Zeiger ja kopieren kann.</p>
</blockquote>
<p>Jein, wenn ich eine konstanten Smartpointer bekommen, sollte ich davon auch nur einen <s>konstenten raw-Pointer</s> ein Raw-Pointer auf Konst bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218915</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Mon, 04 Jun 2012 09:00:26 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 21:08:51 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>krümelkacker, du hast da was falsch verstanden in Bezug auf const und Zeiger.</p>
</blockquote>
<p>Nein, habe ich nicht.</p>
<p>tntnet schrieb:</p>
<blockquote>
<p>Kannst Du das ein wenig genauer erläutern. Ich scheine &quot;const&quot; auch nicht ganz verstanden zu haben <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="😕"
    /> .<br />
[...]<br />
In Deinem Beispiel ist x eine konstante Referenz. Eine konstante Referenz kann ich auch nur einer Konstanten Referenz zuweisen. Also ist y in der Zeile &quot;auto y = x&quot; auch eine konstante Referenz.</p>
</blockquote>
<p>x ist ein Lvalue vom Typ const DiscriminatedPtr&lt;int,double&gt;<br />
y ist ein Lvalue vom Typ DiscriminatedPtr&lt;int,double&gt;</p>
<p>Zeus schrieb:</p>
<blockquote>
<p>Jein, wenn ich eine konstanten Smartpointer bekommen, sollte ich davon auch nur einen konstenten raw-Pointer bekommen - semantisch richtig, dass C++ die Kopie auf ein nicht-konstenten Pointer erlaubt, ist ein Kritik von der D Community <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>
</blockquote>
<p>Das ist Unsinn.</p>
<p>Leute, leute! Ihr enttäuscht mich! Das kann doch nicht so schwer sein! Der Sinn von DiscrimiatedPtr&lt;...&gt; ist ein etwas typsicherer void-Zeiger. Er kann auf Objekte verschiedener Typen zeigen und weiß sogar noch, um welchen Typ es sich da handelt. Da sollte man erwarten, dass sich DiscriminatedPtr&lt;int&gt; ähnlich wie int* verhält. Stattdessen gibt mir ein konstanter Discriminated&lt;int&gt; einen const int* zurück. Das ist einfach Schwachsinn!</p>
<p>Das Verhalten eines normalen rohen Zeigers ist äquivalent zu:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class pointer
{
public:
  ...
  T&amp; operator*() const {return *ptr;}
  T* operator-&gt;() const {return ptr;}
  ...
private:
  T* ptr;
};
</code></pre>
<p>Das heißt: Unabhängig davon, ob ich auf den Zeiger const oder non-const-Zugriff habe, bekomme ich ein T&amp; beim dereferenzieren! Ja, das ist wirklich so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;
void wasbinich(const int&amp;) {cout&lt;&lt;&quot;const int\n&quot;;}
void wasbinich(      int&amp;) {cout&lt;&lt;&quot;      int\n&quot;;}
int main()
{
  int i = 42;
  int*       p = &amp;i;
  int* const q = &amp;i;
  wasbinich(*p);
  wasbinich(*q);
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>int
      int
</code></pre>
<p>Tada!</p>
<p>Bitte Hirn einschalten und dann posten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218994</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 03 Jun 2012 21:08:51 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 21:55:13 GMT]]></title><description><![CDATA[<p>Ja, die const-Overloads im DiscriminatedPtr sind reichlich sinnlos.<br />
&quot;Korrekt&quot; ist mMn. was <code>shared_ptr</code> macht.</p>
<p>D.h. ein <code>DiscriminatedPtr&lt;int, double&gt;</code> müsste implizit zu <code>DiscriminatedPtr&lt;int const, double const&gt;</code> konvertierbar sein, aber nicht umgekehrt.<br />
Und der <code>DiscriminatedPtr&lt;int const, double const&gt;</code> darf dann natürlich auch nur <code>int const*</code> bzw. <code>double const*</code> hergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219006</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 03 Jun 2012 21:55:13 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 22:32:48 GMT]]></title><description><![CDATA[<p>Findet ihr?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class fun
{
public:
	void print() {
		cout &lt;&lt; &quot;Side-effect&quot;;
	}

	void print() const {
		cout &lt;&lt; &quot;Side-effect free&quot;;
	}
};

template&lt;typename T&gt; class pointer
{
public:
	pointer(T* ptr) : ptr(ptr) {

	}
	T* get() {
		return ptr;
	}

	T* get() const {
		return ptr;
	}
private:
	T* ptr;
};

void invoke(const pointer&lt;fun&gt;&amp; ptr) {
	ptr.get()-&gt;print();
}

int main()
{
	fun* f = new fun();
    pointer&lt;fun&gt; p = f;
    invoke(p);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2219011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219011</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sun, 03 Jun 2012 22:32:48 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 22:34:58 GMT]]></title><description><![CDATA[<p>Was it der Sinn deines Beitrags? Was willst du uns damit sagen? Dass du nicht verstanden hast was wir meinen? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2219012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219012</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 03 Jun 2012 22:34:58 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 22:36:22 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Dass du nicht verstanden hast was wir meinen? <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>
</blockquote>
<p>Höchstwahrscheinlich <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/2219013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219013</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sun, 03 Jun 2012 22:36:22 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Sun, 03 Jun 2012 23:00:07 GMT]]></title><description><![CDATA[<p>Naja komm dein Beispiel ist Quatsch, und das solltest du auch wissen wenn du den letzten Beitrag von kk gelesen hättest.</p>
<p>Klar geht das so wie du es zeigst, aber es bleibt trotzdem Quatsch, und es bietet vor allen keinerlei Sicherheit.</p>
<pre><code class="language-cpp">void invoke(const pointer&lt;fun&gt;&amp; ptr) {
    pointer&lt;fun&gt; p2 = ptr;
    p2.get()-&gt;print();
}
</code></pre>
<p>EDIT: OK, du zeigst die Variante wo get immer &quot;T*&quot; und nie &quot;T const&quot;* zurück gibt. Also geht es dort nicht, aber es geht eben so sowieso nicht. /EDIT</p>
<p>Achja, hier die sinnvolle, funktionierende Variante:</p>
<pre><code class="language-cpp">int main() 
{ 
     fun* f = new fun(); 
     pointer&lt;fun const&gt; p = f; 
     invoke(p); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2219015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219015</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 03 Jun 2012 23:00:07 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 05:17:31 GMT]]></title><description><![CDATA[<p>Bloops schrieb:</p>
<blockquote>
<p>Nur warum veröffentlicht Facebook das?</p>
</blockquote>
<p>Weil sie viel auf Open Source setzen und viele ihrer Bibliotheken Open Source machen wollen. Warum auch nicht, wenn man von der Community gratis Bugfixes und neue Features bekommen kann. FB will wohl noch mehr ihrer Bibliotheken veröffentlichen, das ist nur der Anfang.</p>
<p><a href="http://herbsutter.com/2012/06/02/facebook-folly-oss-c-libraries/?utm_source=tf&amp;utm_medium=t" rel="nofollow">http://herbsutter.com/2012/06/02/facebook-folly-oss-c-libraries/?utm_source=tf&amp;utm_medium=t</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219028</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 04 Jun 2012 05:17:31 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 09:29:36 GMT]]></title><description><![CDATA[<p>Ich verstehe zwar grundsätzlich, worauf krümelkacker hinaus will und stimme auch zu, aber stimmt das hier wirklich:</p>
<pre><code class="language-cpp">void foo(DiscriminatedPtr&lt;int,double&gt; const&amp; x)
{
  x.get_nothrow&lt;int&gt;(); // --&gt; const int*
  auto y = x;
  y.get_nothrow&lt;int&gt;(); // --&gt; int*
}
</code></pre>
<p><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="😕"
    /><br />
Wieso geht denn hier beim Kopieren die Constqualifizierung des Zeigers verloren?</p>
<p>Edit: Ach ja. Ich bin ja so doof. Hat sich erledigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219098</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 04 Jun 2012 09:29:36 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 09:28:41 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Ich verstehe zwar grundsätzlich, worauf krümelkacker hinaus will, aber stimmt das hier wirklich:</p>
<pre><code class="language-cpp">void foo(DiscriminatedPtr&lt;int,double&gt; const&amp; x)
{
  x.get_nothrow&lt;int&gt;(); // --&gt; const int*
  auto y = x;
  y.get_nothrow&lt;int&gt;(); // --&gt; int*
}
</code></pre>
<p><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="😕"
    /><br />
Wieso geht denn hier beim Kopieren die Constqualifizierung des Zeigers verloren?</p>
</blockquote>
<p>const/nonconst-Überladung, analog zu dem hier:</p>
<pre><code class="language-cpp">void bar(std::vector&lt;int&gt; const&amp; v)
{
  v.begin(); // --&gt; const_iterator
  auto y = v; //std::vector&lt;int&gt;, ohne const!
  y.begin(); // --&gt; iterator
  auto const z = v; //std::vector&lt;int&gt; const
  z.begin(); // --&gt; ah, const_iterator!
}
</code></pre>
<p><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/2219101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219101</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 04 Jun 2012 09:28:41 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 09:30:21 GMT]]></title><description><![CDATA[<p>Ja. Bin inzwischen selbst drauf gekommen. Nachdenken hilft, wie bereits weiter oben geschrieben wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219104</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 04 Jun 2012 09:30:21 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 11:29:05 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Naja komm dein Beispiel ist Quatsch, und das solltest du auch wissen wenn du den letzten Beitrag von kk gelesen hättest.</p>
</blockquote>
<p>Natürlich ist es Quatsch, ich hab ja KK Rat befolgt und den Const-Q. entfernt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219167</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Mon, 04 Jun 2012 11:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 17:49:49 GMT]]></title><description><![CDATA[<p>Zeus schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Naja komm dein Beispiel ist Quatsch, und das solltest du auch wissen wenn du den letzten Beitrag von kk gelesen hättest.</p>
</blockquote>
<p>Natürlich ist es Quatsch, ich hab ja KK Rat befolgt und den Const-Q. entfernt!</p>
</blockquote>
<p>Was daran nix ändert dass der Code Quatsch ist.</p>
<p>Mit entferntem Const-Qualifizierer sieht man es bloss schneller.<br />
Mit nicht entferntem Const-Qualifizierer ist es deswegen aber nicht weniger Qutasch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219351</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 04 Jun 2012 17:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 18:08:05 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Zeus schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Naja komm dein Beispiel ist Quatsch, und das solltest du auch wissen wenn du den letzten Beitrag von kk gelesen hättest.</p>
</blockquote>
<p>Natürlich ist es Quatsch, ich hab ja KK Rat befolgt und den Const-Q. entfernt!</p>
</blockquote>
<p>Was daran nix ändert dass der Code Quatsch ist.</p>
<p>Mit entferntem Const-Qualifizierer sieht man es bloss schneller.<br />
Mit nicht entferntem Const-Qualifizierer ist es deswegen aber nicht weniger Qutasch.</p>
</blockquote>
<p>Was für ein Quatsch <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/2219357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219357</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Mon, 04 Jun 2012 18:08:05 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 21:44:54 GMT]]></title><description><![CDATA[<p>Zeus, ich versteh' dich nicht. Es wurde nu schon ca. 3x erklärt warum die in DiscriminatedPtr implementierte Variante keinen Sinn macht.</p>
<p><code>const T*</code> ist eben nicht das selbe wie <code>T* const</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219502</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 04 Jun 2012 21:44:54 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Mon, 04 Jun 2012 23:05:48 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Zeus, ich versteh' dich nicht. Es wurde nu schon ca. 3x erklärt warum die in DiscriminatedPtr implementierte Variante keinen Sinn macht.</p>
</blockquote>
<p>Ich seh keine Erklärungen.</p>
<p>Wo besteht die Gemeinsamkeit zwischen den Code?</p>
<pre><code class="language-cpp">template &lt;typename... Types&gt;
class DiscriminatedPtr {

  template &lt;typename T&gt;
  const T* get_nothrow() const noexcept ...

  template &lt;typename T&gt;
  const T* get() const ...

};
</code></pre>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;
void wasbinich(const int&amp;) {cout&lt;&lt;&quot;const int\n&quot;;}
void wasbinich(      int&amp;) {cout&lt;&lt;&quot;      int\n&quot;;}
int main()
{
  int i = 42;
  int*       p = &amp;i;
  int* const q = &amp;i;
  wasbinich(*p);
  wasbinich(*q);
}
</code></pre>
<p>hustbaer schrieb:</p>
<blockquote>
<p><code>const T*</code> ist eben nicht das selbe wie <code>T* const</code> .</p>
</blockquote>
<p>Danke hustbaer genau so iss es!<br />
Das isst es!</p>
<pre><code class="language-cpp">const int* q = &amp;i;
  wasbinich(*q);
</code></pre>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Da hat scheinbar jemand &quot;const&quot; nicht ganz verstanden; denn &quot;const T*&quot; bringt absolut gar nichts, da man den Zeiger ja kopieren kann</p>
</blockquote>
<p>IMO steht das Const nicht dafür da. Was ist daran so schlecht die Const Correctness auf das Objekt zu delegieren.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class fun {
public:
    void print()       {    cout &lt;&lt; &quot;Side-effect&quot;;       }
    void print() const {    cout &lt;&lt; &quot;Side-effect free&quot;;  }
};

template&lt;typename T&gt; class pointer {
public:
    pointer(T* ptr) : ptr(ptr) {}
    T* get() { return ptr; }
    T* get() const { return ptr; }
private:
    T* ptr;
};

void invoke(const pointer&lt;fun&gt; ptr) {
    ptr.get()-&gt;print();
}

void invoke(const fun* ptr) {
    ptr-&gt;print();
}

int main()
{
    fun* f = new fun();
    pointer&lt;fun&gt; p = f;
    invoke(p);
    invoke(f);
}
</code></pre>
<p>Den Entwickler, der die Pointer-Klasse sollte man liquidieren, hat der tatsächlich gewackt eine Klasse wie ein Sprachmittel zu bennen, dass sich garnicht so wie ein solches benimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219513</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Mon, 04 Jun 2012 23:05:48 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Tue, 05 Jun 2012 00:49:32 GMT]]></title><description><![CDATA[<p>Zeus schrieb:</p>
<blockquote>
<p>IMO steht das Const nicht dafür da. Was ist daran so schlecht die Const Correctness auf das Objekt zu delegieren.</p>
</blockquote>
<p>Daran wäre gar nichts schlecht, wenn man es richtig machen würde, was hier aber nicht der Fall ist.</p>
<p>Und falschrum macht es keinen Sinn. Es ist nicht intuitiv, man kann es leicht umgehen (ohne irgendwelche Casts) und man kann sich nichtmal darauf verlassen dass es nicht &quot;unabsichtlich automatisch&quot; umgangen wird.</p>
<p><a href="http://ideone.com/Nmm8s" rel="nofollow">http://ideone.com/Nmm8s</a></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class fun {
public:
        void quack()       { cout &lt;&lt; &quot;mutable\n&quot;; }
        void quack() const { cout &lt;&lt; &quot;const\n&quot;; }
};

template&lt;typename T&gt; class broken_pointer {
public:
        explicit broken_pointer(T* ptr) : ptr(ptr) {}
        T* get() { return ptr; }
        T const* get() const { return ptr; }
        T* operator -&gt; () { return ptr; }
        T const* operator -&gt; () const { return ptr; }
private:
        T* ptr;
};

template&lt;typename T&gt; class good_pointer {
public:
        template &lt;typename U&gt;
        explicit good_pointer(U* ptr) : ptr(ptr) {}
        template &lt;typename U&gt;
        good_pointer(good_pointer&lt;U&gt; const&amp; ptr) : ptr(ptr.get()) {}
        T* get() const { return ptr; }
        T* operator -&gt; () const { return ptr; }
private:
        T* ptr;
};

template &lt;typename DUCK&gt;
void invoke(DUCK d) {
        d-&gt;quack();
}

void test(fun const* native, fun* const reverse_native, const broken_pointer&lt;fun&gt; broken, good_pointer&lt;const fun&gt; good, const good_pointer&lt;fun&gt; reverse_good) {
        cout &lt;&lt; &quot;const T*     : &quot;; invoke(native);
        cout &lt;&lt; &quot;T* const     : &quot;; invoke(reverse_native);
        cout &lt;&lt; &quot;broken&lt;const&gt;: compiliert leider nicht, tjoah\n&quot;;
        cout &lt;&lt; &quot;const broken : &quot;; invoke(broken);
        cout &lt;&lt; &quot;good&lt;const&gt;  : &quot;; invoke(good);
        cout &lt;&lt; &quot;const good   : &quot;; invoke(reverse_good);
}

int main(int /*argc*/, char** /*argv*/) {
        fun* native = new fun();
        test(native, native, broken_pointer&lt;fun&gt;(native), good_pointer&lt;fun&gt;(native), good_pointer&lt;fun&gt;(native));
        delete native;
}
</code></pre>
<p>Frage: was bringt der sog. &quot;const support&quot; in <code>broken_pointer</code> ?</p>
<p>Meine Antwort: nix ausser Verwirrung. Also ganz weglassen, dann ist wenigstens klar dass die Klasse das nicht unterstützt. Bzw. nur teilweise, weil die Konvertierung von <code>ptr&lt;T&gt;</code> nach <code>ptr&lt;const T&gt;</code> nicht implizit unterstützt wird (explizit ist sie ja immer noch mit <code>ptr&lt;const T&gt;(other.get())</code> möglich).</p>
<p>Kannst du mir eine sinnvolle Anwendung dafür nennen? Wenn ja immer her damit, ich kann mir nämlich keine vorstellen.</p>
<blockquote>
<p>Den Entwickler, der die Pointer-Klasse sollte man liquidieren, hat der tatsächlich gewackt eine Klasse wie ein Sprachmittel zu bennen, dass sich garnicht so wie ein solches benimmt.</p>
</blockquote>
<p>Öhm...<br />
Also...<br />
Wenn du mir den Sinn des Verhaltens von <code>const broken_pointer&lt;T&gt;</code> erklären kannst, dann könnte man vielleicht anfangen darüber nachzudenken ob der Name klug gewählt ist. Wenn nicht, dann erübrigt sich mMn. die Diskussion, weil sinnlos eben sinnlos bleibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219523</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 05 Jun 2012 00:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Tue, 05 Jun 2012 05:43:36 GMT]]></title><description><![CDATA[<p>Vielleicht sollten wir beide eine neuen Auflage von Andrei Alexandrescu Modernes C++ Design lesen. Er kann bestimmt dir viel besser ConstPolicy für seine SmartPointer erläutern.</p>
<pre><code class="language-cpp">////////////////////////////////////////////////////////////////////////////////
/// @note These policy classes are used in LockingPtr and SmartPtr to define
///  how const is propagated from the pointee.
////////////////////////////////////////////////////////////////////////////////[/
template&lt; class T &gt; struct DontPropagateConst
{
    typedef T Type;
};

template&lt; class T &gt; struct PropagateConst
{
    typedef const T Type;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2219544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219544</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Tue, 05 Jun 2012 05:43:36 GMT</pubDate></item><item><title><![CDATA[Reply to facebook releases Folly, an open source C++ library on Tue, 05 Jun 2012 06:42:46 GMT]]></title><description><![CDATA[<p>Zeus schrieb:</p>
<blockquote>
<p>Vielleicht sollten wir beide eine neuen Auflage von Andrei Alexandrescu Modernes C++ Design lesen. Er kann bestimmt dir viel besser ConstPolicy für seine SmartPointer erläutern.</p>
<pre><code class="language-cpp">////////////////////////////////////////////////////////////////////////////////
/// @note These policy classes are used in LockingPtr and SmartPtr to define
///  how const is propagated from the pointee.
////////////////////////////////////////////////////////////////////////////////[/
template&lt; class T &gt; struct DontPropagateConst
{
    typedef T Type;
};

template&lt; class T &gt; struct PropagateConst
{
    typedef const T Type;
};
</code></pre>
</blockquote>
<p>Das Ding beschreibt aber, wie das const von dem Ding, auf das gezeigt wird (eben der Pointee) weitergereicht wird. Mit der Constness des Pointers hat das nichts zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2219556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2219556</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 05 Jun 2012 06:42:46 GMT</pubDate></item></channel></rss>