<?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[explicit keyword]]></title><description><![CDATA[<p>Hi,</p>
<p>warum macht der compiler ueberhaupt eine implicit type conversion wenn ich folgendes aufrufe?</p>
<pre><code>Foo f1 = 2;
</code></pre>
<p>und explicit sollte das verhindern, was nur bei 1 parameter funktioniert?</p>
<pre><code>class Foo {
public:
    explicit Foo(int x) {}
};

class Bar {
public:
    Bar(double x) {}
};

int main() {
    Foo f1 = 2;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/325640/explicit-keyword</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 14:25:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325640.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 May 2014 18:45:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 18:45:37 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>warum macht der compiler ueberhaupt eine implicit type conversion wenn ich folgendes aufrufe?</p>
<pre><code>Foo f1 = 2;
</code></pre>
<p>und explicit sollte das verhindern, was nur bei 1 parameter funktioniert?</p>
<pre><code>class Foo {
public:
    explicit Foo(int x) {}
};

class Bar {
public:
    Bar(double x) {}
};

int main() {
    Foo f1 = 2;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2398665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398665</guid><dc:creator><![CDATA[tobi007]]></dc:creator><pubDate>Sun, 11 May 2014 18:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 19:43:15 GMT]]></title><description><![CDATA[<p>gilt das nur wenn ich keinen copy constructor definiere?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398670</guid><dc:creator><![CDATA[tobi007]]></dc:creator><pubDate>Sun, 11 May 2014 19:43:15 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 19:46:25 GMT]]></title><description><![CDATA[<p>tobi007 schrieb:</p>
<blockquote>
<p>warum macht der compiler ueberhaupt eine implicit type conversion wenn ich folgendes aufrufe?</p>
</blockquote>
<p>Weil in C++ Konstruktoren, die mit einem Argument aufgerufen werden können und nicht <code>explicit</code> sind, Konvertierungskonstruktoren darstellen. Ist nicht schön, da <code>explicit</code> die Regel und nicht die Ausnahme ist, aber die Einsicht hätte vor zwei Jahrzehnten kommen müssen.</p>
<p>tobi007 schrieb:</p>
<blockquote>
<p>gilt das nur wenn ich keinen copy constructor definiere?</p>
</blockquote>
<p>Nein, das hat damit nichts zu tun. Kopierkonstruktoren werden nur in Betracht gezogen, wenn das Argument vom gleichen Typ wie die Klasse ist. Der Compiler definiert sowieso Kopierkonstruktoren, wenn er kann und du nichts angibst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398671</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 11 May 2014 19:46:25 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 19:55:46 GMT]]></title><description><![CDATA[<p>warum compiliert dann line 18 nicht? -&gt; error: no matching function for call to ‘Foo::Foo(Foo)’</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class Foo { 
public:  
	Foo(int x) { cout &lt;&lt; &quot;Foo constructor&quot; &lt;&lt; endl; }
	Foo(Foo &amp;a) { cout &lt;&lt; &quot;Foo copy constructor&quot; &lt;&lt; endl; }
}; 

class Bar { 
public: 
	Bar(int x) { cout &lt;&lt; &quot;Bar constructor&quot; &lt;&lt; endl; }
}; 

int main() { 
    Foo f1(2); 
  	Foo f2 = f1;
  	Foo f3 = 2; //&lt;--- fails

  	Bar b = 2; // implicit convertion

    return 0; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2398675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398675</guid><dc:creator><![CDATA[tobi007]]></dc:creator><pubDate>Sun, 11 May 2014 19:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 20:03:08 GMT]]></title><description><![CDATA[<p>Weil</p>
<pre><code>Foo(Foo &amp;a)
</code></pre>
<p>kein richtiger Kopierkonstruktor ist*. Du brauchst eine Referenz auf const. Mit der Anweisung</p>
<pre><code>Foo f3 = 2;
</code></pre>
<p>versuchst du, ein temporäres Objekt an eine Referenz auf nicht-konstante Objekte zu binden, was nicht erlaubt ist.</p>
<p>Darin liegt auch ein subtiler Unterschied zwischen den Deklarationen <code>T var(expr);</code> und <code>T var = expr;</code> . Bei letzterem darf der Compiler <code>T var = T(expr);</code> draus machen. Und auch wenn er es nicht macht, muss dieser Ausdruck kompilieren.</p>
<p>_______<br />
* Diese Konstruktorsignatur wurde in C++98 als Hack eingesetzt, um Move-Konstruktoren zu emulieren. Prominentestes Beispiel dieses Idioms ist <code>std::auto_ptr</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398676</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 11 May 2014 20:03:08 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 20:04:15 GMT]]></title><description><![CDATA[<p>Wobei allerdings noch anzumerken ist:<br />
Es wird zwar verlangt, dass dort ein Copyctor existiert, er wird aber nicht aufgerufen, da das wegoptimiert werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398677</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 11 May 2014 20:04:15 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 20:04:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@nexus</a>: oh sorry nicht gesehen <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>welchen konstruktorsignatur hack meinst du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398678</guid><dc:creator><![CDATA[tobi007]]></dc:creator><pubDate>Sun, 11 May 2014 20:04:47 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 20:08:27 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ist nicht schön, da <code>explicit</code> die Regel und nicht die Ausnahme ist</p>
</blockquote>
<p>Was meinst du damit?</p>
<blockquote>
<p>Kopierkonstruktoren werden nur in Betracht gezogen, wenn das Argument vom gleichen Typ wie die Klasse ist.</p>
</blockquote>
<p>Falsch. Kopierkonstruktoren werden genauso in die Overload-Resolution mit einbezogen wie andere Funktionen. (s. §13.3.1.4)<br />
Edit:</p>
<blockquote>
<p>kein richtiger Kopierkonstruktor ist*.</p>
</blockquote>
<p>Ebenfalls falsch. Es ist ein Kopierkonstruktor, jedoch kein sinnvoller.</p>
<p>War das zu nitpickerisch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398679</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 11 May 2014 20:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 20:39:34 GMT]]></title><description><![CDATA[<p>wie laesst sich folgendes erklaeren?</p>
<pre><code>Foo f2 = f1; // ... ruft den copy constructor auf 
Foo f3 = 2; // ... ruft the constructor auf
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2398687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398687</guid><dc:creator><![CDATA[tobi007]]></dc:creator><pubDate>Sun, 11 May 2014 20:39:34 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 20:43:25 GMT]]></title><description><![CDATA[<p>ok, sollte nun klar sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398690</guid><dc:creator><![CDATA[tobi007]]></dc:creator><pubDate>Sun, 11 May 2014 20:43:25 GMT</pubDate></item><item><title><![CDATA[Reply to explicit keyword on Sun, 11 May 2014 20:46:11 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@nexus</a> du meinst ja wohl folgendes?</p>
<pre><code>T y;
T x = y; means T x(T(y));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2398692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398692</guid><dc:creator><![CDATA[tobi007]]></dc:creator><pubDate>Sun, 11 May 2014 20:46:11 GMT</pubDate></item></channel></rss>