<?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[Kleines aber unverständlichen const Problem]]></title><description><![CDATA[<p>Ich bin eigentlich der Meinung dass ich inzwischen eher weniger Überraschungen mehr seitens Compiler bekommen werde, aber dieses Verhalten ist mir absolut unverständlich. Ich benutze MSVC++ 2010.</p>
<p>Also folgende Klassen (nur auf das wesentliche beschränkt) und Code:</p>
<pre><code class="language-cpp">// a.h
class A {
public:
const B &amp;operator[](int index) const;

private:
B &amp;operator[](int index);
};

// b.h
class B {
public:
  void foo() const;
};

//main.cpp
int main()
{
  A a;
  a[0].foo(); // error C2248: &quot;A::operator []&quot;: Kein Zugriff auf private Member, dessen Deklaration in der A-Klasse erfolgte.
}
</code></pre>
<p>Also eine Methodensignatur setzt sich aus dem Namen, Parametern und dem const-modifier zusammen. So gesehen sind die []-Operator-Methoden überschrieben, aber die private Variant verdeckt die public Variante nicht. Wieso motzt mich dann der Compiler an (wenn ich nochdazu das B-Objekt nur const brauche), wenn ich auf die public Variante zugreifen will. Kommentiere ich die private-Variante aus kommt kein Fehler mehr. Auch wenn ich mein a (const A&amp;) caste funktionierts, aber wieso checkt der Compiler es so nicht? Jemand nen Tipp? Ist nicht essentiell, aber mich interessiert einfach wie manchmal der Compiler tickt.</p>
<p>gruß Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304890/kleines-aber-unverständlichen-const-problem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 27 Jun 2026 02:16:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304890.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 16 Jun 2012 10:47:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 10:47:08 GMT]]></title><description><![CDATA[<p>Ich bin eigentlich der Meinung dass ich inzwischen eher weniger Überraschungen mehr seitens Compiler bekommen werde, aber dieses Verhalten ist mir absolut unverständlich. Ich benutze MSVC++ 2010.</p>
<p>Also folgende Klassen (nur auf das wesentliche beschränkt) und Code:</p>
<pre><code class="language-cpp">// a.h
class A {
public:
const B &amp;operator[](int index) const;

private:
B &amp;operator[](int index);
};

// b.h
class B {
public:
  void foo() const;
};

//main.cpp
int main()
{
  A a;
  a[0].foo(); // error C2248: &quot;A::operator []&quot;: Kein Zugriff auf private Member, dessen Deklaration in der A-Klasse erfolgte.
}
</code></pre>
<p>Also eine Methodensignatur setzt sich aus dem Namen, Parametern und dem const-modifier zusammen. So gesehen sind die []-Operator-Methoden überschrieben, aber die private Variant verdeckt die public Variante nicht. Wieso motzt mich dann der Compiler an (wenn ich nochdazu das B-Objekt nur const brauche), wenn ich auf die public Variante zugreifen will. Kommentiere ich die private-Variante aus kommt kein Fehler mehr. Auch wenn ich mein a (const A&amp;) caste funktionierts, aber wieso checkt der Compiler es so nicht? Jemand nen Tipp? Ist nicht essentiell, aber mich interessiert einfach wie manchmal der Compiler tickt.</p>
<p>gruß Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223839</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Sat, 16 Jun 2012 10:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 11:25:13 GMT]]></title><description><![CDATA[<p>Ich schrieb hier unsinn...</p>
<blockquote>
<p>Haste mal</p>
<pre><code class="language-cpp">[s]
//main.cpp 
int main() 
{ 
  A const a; 
  a[0].foo(); // error C2248: &quot;A::operator []&quot;: Kein Zugriff auf private Member, dessen Deklaration in der A-Klasse erfolgte. [/s]
}
</code></pre>
<p>Versucht?</p>
<p>Ich würd sagen der msvc sucht die passende Funktion, die ist bei dir private.</p>
<p>Gruss</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2223843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223843</guid><dc:creator><![CDATA[tommy_tom_tom]]></dc:creator><pubDate>Sat, 16 Jun 2012 11:25:13 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 11:40:26 GMT]]></title><description><![CDATA[<p>Dein A Objekt ist nicht const, hat aber nur einen public operator [], der const ist. Der non const operator [] ist nicht zugänglich, genau das sagt dir auch der Compiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223857</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 16 Jun 2012 11:40:26 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 11:41:46 GMT]]></title><description><![CDATA[<p>tommy_tom_tom schrieb:</p>
<blockquote>
<p>Haste mal</p>
<pre><code class="language-cpp">//main.cpp 
int main() 
{ 
  A const a; 
  a[0].foo(); // error C2248: &quot;A::operator []&quot;: Kein Zugriff auf private Member, dessen Deklaration in der A-Klasse erfolgte. 
}
</code></pre>
<p>Versucht?</p>
<p>Ich würd sagen der msvc sucht die passende Funktion, die ist bei dir private.</p>
<p>Gruss</p>
</blockquote>
<p>So würde es auch gehen, aber ich will das Objekt ja auch noch davor verändern. In meinen Augen ist hier nichts ambiguous, und es besteht eigentlich keinen Grund vom Compiler zu meckern. Vielleicht ist ja der gcc nicht so schwerfällig.</p>
<p>Was ich aber auch interessant finde ist, dass der Compiler die nicht const-Version stets bevorzugt.</p>
<p>gruß Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223860</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Sat, 16 Jun 2012 11:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 11:44:01 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Dein A Objekt ist nicht const, hat aber nur einen public operator [], der const ist. Der non const operator [] ist nicht zugänglich, genau das sagt dir auch der Compiler.</p>
</blockquote>
<p>Es gibt aber keinen Grund, wieso der Code nicht ausführbar wäre, denn ich rufe die private Variante ja auch nicht auf!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223862</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Sat, 16 Jun 2012 11:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 11:46:18 GMT]]></title><description><![CDATA[<p>Nochmal: Der Compiler <em>darf</em> die const Variante nicht aufrufen, weil das Objekt nicht const ist. Und die non-const Variante ist private, also kann er die nicht aufrufen. Das ist nicht ambiguous oder sonstwas, sondern einfach nicht möglich. Der Compiler tut genau, was er laut C++ Standard tun soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223863</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 16 Jun 2012 11:46:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 11:51:46 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Nochmal: Der Compiler <em>darf</em> die const Variante nicht aufrufen, weil das Objekt nicht const ist.</p>
</blockquote>
<p>Wieso darf er die const-Variante dann aufrufen, wenn es nur diese gibt (wenn man die private non-const-Variante auskommentiert)?</p>
<p>Ich würde von der Logik her auch erwarten, dass der Compiler die const-Funktion nimmt, wenn die non-const zwar verfügbar, aber private is, da er es ja auch macht, wenn sie gar net da is.</p>
<p>Aber wenn der Standard was anderes sagt, müssen sich die Compiler natürlich dran halten, das ist wieder ein andere Paar Schuhe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223867</guid><dc:creator><![CDATA[conster]]></dc:creator><pubDate>Sat, 16 Jun 2012 11:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 11:52:54 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Nochmal: Der Compiler <em>darf</em> die const Variante nicht aufrufen, weil das Objekt nicht const ist. Und die non-const Variante ist private, also kann er die nicht aufrufen. Das ist nicht ambiguous oder sonstwas, sondern einfach nicht möglich. Der Compiler tut genau, was er laut C++ Standard tun soll.</p>
</blockquote>
<p>Der Compiler darf sehrwohl die const Variante aufrufen! Folgender Code zeigt genau die Dummheit:</p>
<pre><code class="language-cpp">class A
{
public:
	void foo() const {}
	void bar() const {}
private:
	void bar(){}
};

int main()
{
	A a;
	a.foo(); // const Aufruf funktioniert
	a.bar(); // const Aufruf scheitert
}
</code></pre>
<p>Und der Aufruf scheitert nur, weil es eine private Methode gibt, die besser passen würde. Dümmlichst!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223868</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Sat, 16 Jun 2012 11:52:54 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 11:57:59 GMT]]></title><description><![CDATA[<p>Stimmt, sorry, da war ich tatsächlich grad ziemlich verwirrt...</p>
<p>EDIT: Das Verhalten ist allerdings genau was der C++ Standard vorsieht. Die Überprüfung, ob der ausgewählte Member accessible ist, wird erst nach der Overload Resolution durchgeführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223869</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 16 Jun 2012 11:57:59 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 11:56:27 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Stimmt, sorry, da war ich tatsächlich grad ziemlich verwirrt...</p>
</blockquote>
<p>Ja und wenn man ihn ausdrücklich bittet funktionierts dann doch <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>
<pre><code class="language-cpp">((const A&amp;)a).bar(); // const Aufruf funktioniert auf einmal doch
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2223870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223870</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Sat, 16 Jun 2012 11:56:27 GMT</pubDate></item><item><title><![CDATA[Reply to Kleines aber unverständlichen const Problem on Sat, 16 Jun 2012 12:14:20 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>EDIT: Das Verhalten ist allerdings genau was der C++ Standard vorsieht. Die Überprüfung, ob der ausgewählte Member accessible ist, wird erst nach der Overload Resolution durchgeführt.</p>
</blockquote>
<p>Diese bessere Erklärung hatte mir gefehlt, ich war mit meinem ersten Beitrag so unsicher und wollt kein Müll plappern... aber selbiges hat mich doch Scott auch gelehrt...</p>
<p>Hm...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223876</guid><dc:creator><![CDATA[tommy_tom_tom]]></dc:creator><pubDate>Sat, 16 Jun 2012 12:14:20 GMT</pubDate></item></channel></rss>