<?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[Wie weit geht const-correctness?]]></title><description><![CDATA[<p>Hallo hallo,</p>
<p>ich habe begonnen eine kleine private Bibliothek zu schreiben und bin momentan bei Netzwerk-Sockets. Schon des öfteren habe ich mich gefragt, wie radikal ich/man const-correctness (bei Methoden) durchziehen sollte.</p>
<p>Folgendes Beispiel:<br />
Man glaubt es kaum - meiner Socket-Klasse liegt ein privater int m_fd zugrunde <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="🙂"
    /><br />
Für Sockets gibt es die wertvolle Möglichkeit mittels recv und MSG_PEEK ankommende Daten zwar zu lesen, jedoch nicht aus der Warteschlange zu entfernen.<br />
Also habe ich mir eine praktische Methode peek geschrieben:</p>
<pre><code class="language-cpp">int Socket::recv(void* buf,int len,int flags)
{
	return ::recv(m_fd,buf,len,flags);
}

int Socket::peek(void* buf,int len) const
{
	return recv(buf,len,MSG_PEEK);
}
</code></pre>
<p>Der Compiler mag diese leider nicht, weil Socket::recv nicht const ist. Socket::recv habe ich instinktiv nicht als const deklariert, da ich ja weiß, dass zwar keine Membervariablen verändert, jedoch der eingehende Datenstrom verkürzt wird.</p>
<p>Vielleicht ist meine Frage nun schon klar geworden. Wenn nicht - jetzt genau:<br />
Sollte man const-correctness immer beinhart auf die Veränderung von Membervariablen beziehen (also Socket::recv als const deklarieren) oder ist die im Beispiel genannte Semantik ebenfalls zu beachten?</p>
<p>Ich hoffe meine Frage ist klar geworden und Ihr habt einen guten Rat für mich <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>
<p>Danke und herzliche Grüße,<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292930/wie-weit-geht-const-correctness</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 15:41:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292930.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Sep 2011 01:35:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 01:35:43 GMT]]></title><description><![CDATA[<p>Hallo hallo,</p>
<p>ich habe begonnen eine kleine private Bibliothek zu schreiben und bin momentan bei Netzwerk-Sockets. Schon des öfteren habe ich mich gefragt, wie radikal ich/man const-correctness (bei Methoden) durchziehen sollte.</p>
<p>Folgendes Beispiel:<br />
Man glaubt es kaum - meiner Socket-Klasse liegt ein privater int m_fd zugrunde <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="🙂"
    /><br />
Für Sockets gibt es die wertvolle Möglichkeit mittels recv und MSG_PEEK ankommende Daten zwar zu lesen, jedoch nicht aus der Warteschlange zu entfernen.<br />
Also habe ich mir eine praktische Methode peek geschrieben:</p>
<pre><code class="language-cpp">int Socket::recv(void* buf,int len,int flags)
{
	return ::recv(m_fd,buf,len,flags);
}

int Socket::peek(void* buf,int len) const
{
	return recv(buf,len,MSG_PEEK);
}
</code></pre>
<p>Der Compiler mag diese leider nicht, weil Socket::recv nicht const ist. Socket::recv habe ich instinktiv nicht als const deklariert, da ich ja weiß, dass zwar keine Membervariablen verändert, jedoch der eingehende Datenstrom verkürzt wird.</p>
<p>Vielleicht ist meine Frage nun schon klar geworden. Wenn nicht - jetzt genau:<br />
Sollte man const-correctness immer beinhart auf die Veränderung von Membervariablen beziehen (also Socket::recv als const deklarieren) oder ist die im Beispiel genannte Semantik ebenfalls zu beachten?</p>
<p>Ich hoffe meine Frage ist klar geworden und Ihr habt einen guten Rat für mich <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>
<p>Danke und herzliche Grüße,<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121850</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Wed, 21 Sep 2011 01:35:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 01:41:16 GMT]]></title><description><![CDATA[<p>Ich würde es so lassen und peek halt ::recv aufrufen lassen. Wie du schon richtig gemerkt hast, verändert ::recv() ohne MSG_PEEK halt den Zustand des Objekts, unabhängig davon, ob jetzt Membervariablen verändert werden oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121851</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 21 Sep 2011 01:41:16 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 02:18:18 GMT]]></title><description><![CDATA[<p>MaDsTyLe schrieb:</p>
<blockquote>
<p>Sollte man const-correctness immer beinhart auf die Veränderung von Membervariablen beziehen (also Socket::recv als const deklarieren) oder ist die im Beispiel genannte Semantik ebenfalls zu beachten?</p>
</blockquote>
<p>sehr schöne Frage! ganz klar auf die semantik fokussieren, inwieweit membervariablen betroffen sind, ist nur ein implementierungsdetail <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121852</guid><dc:creator><![CDATA[Klara Fall]]></dc:creator><pubDate>Wed, 21 Sep 2011 02:18:18 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 06:02:21 GMT]]></title><description><![CDATA[<p>Normalerweise implementiert man das &quot;logischer const&quot;.</p>
<p>@Klara Fall: Magst du Kinderbücher? Meine Schwester hat dieses Buch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121862</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 21 Sep 2011 06:02:21 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 06:06:10 GMT]]></title><description><![CDATA[<p>Sicher dass der Compiler sich beschwert? Der Socket-Aufruf nimmt den Deskriptor doch per Value, also eigentlich keine Änderung am Objekt die für den Compiler erkenntlich wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121865</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 21 Sep 2011 06:06:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 06:21:53 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Sicher dass der Compiler sich beschwert? Der Socket-Aufruf nimmt den Deskriptor doch per Value, also eigentlich keine Änderung am Objekt die für den Compiler erkenntlich wäre.</p>
</blockquote>
<p>recv ist nicht const, deswegen beschwert sich der Compiler. Du kannst aus einer const Methode keine non-const Methode aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121867</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Wed, 21 Sep 2011 06:21:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 06:25:22 GMT]]></title><description><![CDATA[<p>Sollte man vielleicht <code>Socket::recv const</code> machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121869</guid><dc:creator><![CDATA[Frager_]]></dc:creator><pubDate>Wed, 21 Sep 2011 06:25:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 06:29:16 GMT]]></title><description><![CDATA[<p>evilissimo schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>Sicher dass der Compiler sich beschwert? Der Socket-Aufruf nimmt den Deskriptor doch per Value, also eigentlich keine Änderung am Objekt die für den Compiler erkenntlich wäre.</p>
</blockquote>
<p>recv ist nicht const, deswegen beschwert sich der Compiler. Du kannst aus einer const Methode keine non-const Methode aufrufen.</p>
</blockquote>
<p>Wenn das Objekt dabei nicht geändert wird schon? Sonst könnte man da ja sowieso nur Memerfunktionen aufrufen, da freie Funktionen ja nicht const sein können.<br />
Unter anderem würde doch zb die ganze C-Library unter den Tisch fallen und ich könnte schwören, teile aus cmath in konstanten Gettern verwendet zu haben. <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/2121871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121871</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 21 Sep 2011 06:29:16 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 06:46:51 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>evilissimo schrieb:</p>
<blockquote>
<p>recv ist nicht const, deswegen beschwert sich der Compiler. Du kannst aus einer const Methode keine non-const Methode aufrufen.</p>
</blockquote>
<p>Wenn das Objekt dabei nicht geändert wird schon? Sonst könnte man da ja sowieso nur Memerfunktionen aufrufen, da freie Funktionen ja nicht const sein können.<br />
Unter anderem würde doch zb die ganze C-Library unter den Tisch fallen und ich könnte schwören, teile aus cmath in konstanten Gettern verwendet zu haben. <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>Genauer: Du kannst aus einer const Methode keine non-const Methode der gleichen Klasse aufrufen.</p>
<p>Noch genauer: Wenn this const ist, kannst Du keine non-const Methode auf this aufrufen.</p>
<p>Wenn Du in einer const-Methode ein beliebiges anderes non-const Objekt hast, kannst Du auf diesem Objekt natürlich auch non-const Methoden aufrufen. Und da freie und statische Funktionen garkeinem Objekt zugeordnet sind, kannst Du diese selbstverständlich auch aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121873</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 21 Sep 2011 06:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 06:56:55 GMT]]></title><description><![CDATA[<p>Klara Fall schrieb:</p>
<blockquote>
<p>sehr schöne Frage! ganz klar auf die semantik fokussieren, inwieweit membervariablen betroffen sind, ist nur ein implementierungsdetail <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>Ganz genau.<br />
Und um dem Compiler beizubringen, was in einer const Methode verändert werde darf gibt es <code>mutable</code> .</p>
<p><a href="http://www.gotw.ca/gotw/006.htm" rel="nofollow">GOTW Const-Correctness</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121877</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 21 Sep 2011 06:56:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 07:06:35 GMT]]></title><description><![CDATA[<p>Ah lol, ich check jetzt erst, dass er in peek ja nicht das freie recv sondern die Memberfunktion aufruft.<br />
Habt mich gerade echt verwirrt.^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2121880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121880</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 21 Sep 2011 07:06:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie weit geht const-correctness? on Wed, 21 Sep 2011 13:05:14 GMT]]></title><description><![CDATA[<p>Ganz genau <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>
<p>Hätte ich in peek auch ::recv verwendet, wäre das Beispiel nicht ganz so schön geworden <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>Ich freue mich, dass mich mein Instinkt auch schon immer zur Beurteilung der Semantik getrieben hat <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>
<p>Habt vielen Dank!</p>
<p>Herzliche Grüße,<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2122096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2122096</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Wed, 21 Sep 2011 13:05:14 GMT</pubDate></item></channel></rss>