<?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[Deklaration mit new]]></title><description><![CDATA[<p>Was ist der Unterschied zwischen diesen beiden Notationen:</p>
<pre><code class="language-cpp">int * p(new int(3));
int * p = new int(3);
</code></pre>
<p>Letzteres kenne und nutze ich, und ersteres sehe ich häufiger, z.B. bei Boost Beispielen kann ich aber nicht einordnen.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217960/deklaration-mit-new</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 19:35:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217960.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Jul 2008 11:26:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 11:26:42 GMT]]></title><description><![CDATA[<p>Was ist der Unterschied zwischen diesen beiden Notationen:</p>
<pre><code class="language-cpp">int * p(new int(3));
int * p = new int(3);
</code></pre>
<p>Letzteres kenne und nutze ich, und ersteres sehe ich häufiger, z.B. bei Boost Beispielen kann ich aber nicht einordnen.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547046</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Mon, 14 Jul 2008 11:26:42 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 11:32:04 GMT]]></title><description><![CDATA[<p>Kein Unterschied, is beides das Gleiche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547051</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 14 Jul 2008 11:32:04 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 11:32:32 GMT]]></title><description><![CDATA[<p>Ist meinse Wissens exakt dasselbe. In C++ ist die Deklaration mit = äquivalent zu einem Konstruktoraufruf mit einem Parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547052</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 14 Jul 2008 11:32:32 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 11:37:16 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int i = 3;
int i(3);
</code></pre>
<p>Ist auch das gleiche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547056</guid><dc:creator><![CDATA[Strolch]]></dc:creator><pubDate>Mon, 14 Jul 2008 11:37:16 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 11:46:13 GMT]]></title><description><![CDATA[<p>Naja, so ganz das gleiche ist es wohl nicht. Sonst<br />
ware dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p(new MyClass);
</code></pre>
<p>ja da gleiche wie dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p = new MyClass;
</code></pre>
<p>Letzteres ist aber nicht möglich, da der Konstruktor von std::auto_ptr&lt;&gt; ja<br />
'explicit' ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547062</guid><dc:creator><![CDATA[bladerunner10]]></dc:creator><pubDate>Mon, 14 Jul 2008 11:46:13 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 11:48:11 GMT]]></title><description><![CDATA[<p>Strolch schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int i = 3;
int i(3);
</code></pre>
<p>Ist auch das gleiche.</p>
</blockquote>
<p>Danke, das hatte ich mir schon gedacht.</p>
<p>Was aber ist dann aber folgendes:</p>
<pre><code class="language-cpp">new MeineKlasse();
</code></pre>
<p>was ich auch schonmal gesehen habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547063</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Mon, 14 Jul 2008 11:48:11 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 11:52:53 GMT]]></title><description><![CDATA[<p>bladerunner10 schrieb:</p>
<blockquote>
<p>Naja, so ganz das gleiche ist es wohl nicht. Sonst<br />
ware dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p(new MyClass);
</code></pre>
<p>ja da gleiche wie dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p = new MyClass;
</code></pre>
<p>Letzteres ist aber nicht möglich, da der Konstruktor von std::auto_ptr&lt;&gt; ja<br />
'explicit' ist.</p>
</blockquote>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p = new MyClass;
</code></pre>
<p>entspricht:</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p( std::auto_ptr_ref&lt;MyClass&gt;( new MyClass ) );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1547065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547065</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 14 Jul 2008 11:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 12:06:03 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p = new MyClass;
</code></pre>
<p>entspricht:</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p( std::auto_ptr_ref&lt;MyClass&gt;( new MyClass ) );
</code></pre>
</blockquote>
<p>Nö.</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p = new MyClass;
</code></pre>
<p>ist nicht möglich!</p>
<p>VC2008 schrieb:</p>
<blockquote>
<p><a href="http://ap.cc" rel="nofollow">ap.cc</a>(7) : error C2440: 'Initialisierung': 'MyClass *' kann nicht in 'std::auto_ptr&lt;_Ty&gt;' konvertiert werden<br />
with<br />
[<br />
_Ty=MyClass<br />
]<br />
Konstruktor für class 'std::auto_ptr&lt;_Ty&gt;' ist als 'explicit' deklariert<br />
with<br />
[<br />
_Ty=MyClass<br />
]</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1547074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547074</guid><dc:creator><![CDATA[bladerunner10]]></dc:creator><pubDate>Mon, 14 Jul 2008 12:06:03 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 12:44:14 GMT]]></title><description><![CDATA[<p>Wenn ein Type T implizit in auto_ptr_ref konvertiert werden kann, sollte es eigentlich gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547084</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 14 Jul 2008 12:44:14 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 12:49:04 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Wenn ein Type T implizit in auto_ptr_ref konvertiert werden kann, sollte es eigentlich gehen.</p>
</blockquote>
<p>Na dann zeig mal, wie das gehen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547086</guid><dc:creator><![CDATA[bladerunner10]]></dc:creator><pubDate>Mon, 14 Jul 2008 12:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 12:53:29 GMT]]></title><description><![CDATA[<p>Hm, kann auch sein, dass das in dem Fall einfach Unkonformität von Visual Studio ist. Folgender Code wird bei mir z.B. kompiliert (VC++ 2005):</p>
<pre><code class="language-cpp">struct foo
{
  foo( int x ) {}
};

struct bar
{
  explicit bar( int x )
  {
  };

  bar( foo c )
  {
  }
};

int main()
{
	bar b = 10;
}
</code></pre>
<p>Wie ich das auf die Schnelle aus dem Standard rauslesen konnt ist das aber wohl nicht konform. Nunja...</p>
<p>Auf jeden Fall wird bei einem <em>T a = b;</em> immer versucht einen entsprechenden Konstruktor zu verwenden (nicht etwa den Zuweissungsoperator).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547090</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 14 Jul 2008 12:53:29 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 12:59:46 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Auf jeden Fall wird bei einem <em>T a = b;</em> immer versucht einen entsprechenden Konstruktor zu verwenden (nicht etwa den Zuweissungsoperator).</p>
</blockquote>
<p>Das ist richtig. Dennoch muss bei dieser Art der Initialisierung die Zuweisung möglich sein (sprich der Ausdruck &quot;a = b&quot; ohne Initialisierung muss ebenfalls zulässig sein). Erst dann ist die Initialisierung auch zulässig.</p>
<p>Der MSVC2005 setzt das meines Wissens in der Tat falsch um.</p>
<p>EDIT:<br />
Zum auto_ptr_ref - über diese Klasse wird im Standard so wenig angegeben, dass Experimente damit bestenfalls rein spekulativ sind <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1547096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547096</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 14 Jul 2008 12:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 13:05:07 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Das ist richtig. Dennoch muss bei dieser Art der Initialisierung die Zuweisung möglich sein (sprich der Ausdruck &quot;a = b&quot; ohne Initialisierung muss ebenfalls zulässig sein). Erst dann ist die Initialisierung auch zulässig.</p>
<p>Der MSVC2005 setzt das meines Wissens in der Tat falsch um.</p>
</blockquote>
<p>Der MSVC2008 ist an der Stelle ebenfalls buggy.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547100</guid><dc:creator><![CDATA[bladerunner10]]></dc:creator><pubDate>Mon, 14 Jul 2008 13:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 13:08:13 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Zum auto_ptr_ref - über diese Klasse wird im Standard so wenig angegeben, dass Experimente damit bestenfalls rein spekulativ sind <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>
</blockquote>
<p>Ja, die Infos darüber sind in der Tat sehr rar! <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/1547102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547102</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 14 Jul 2008 13:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 14:43:15 GMT]]></title><description><![CDATA[<p>Der auto_ptr ist in C++0x eh deprecated. Nicht ohne Grund! <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/1547167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547167</guid><dc:creator><![CDATA[Strolch]]></dc:creator><pubDate>Mon, 14 Jul 2008 14:43:15 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 15:20:10 GMT]]></title><description><![CDATA[<p>bladerunner10 schrieb:</p>
<blockquote>
<p>Naja, so ganz das gleiche ist es wohl nicht. Sonst<br />
ware dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p(new MyClass);
</code></pre>
<p>ja da gleiche wie dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p = new MyClass;
</code></pre>
<p>Letzteres ist aber nicht möglich, da der Konstruktor von std::auto_ptr&lt;&gt; ja<br />
'explicit' ist.</p>
</blockquote>
<p>Kannst du bitte erklären wo da der Zusammenhang zum diskutierten Thema besteht. Wenn man das überfliegt, sieht es irgendwie nach sinnlosem Murks aus, besonders die 2. Codezeile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547184</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Mon, 14 Jul 2008 15:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 17:30:26 GMT]]></title><description><![CDATA[<p>bladerunner10 schrieb:</p>
<blockquote>
<p>Naja, so ganz das gleiche ist es wohl nicht. Sonst<br />
ware dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p(new MyClass);
</code></pre>
<p>ja da gleiche wie dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p = new MyClass;
</code></pre>
<p>Letzteres ist aber nicht möglich, da der Konstruktor von std::auto_ptr&lt;&gt; ja<br />
'explicit' ist.</p>
</blockquote>
<p>auto_ptr ist eine Klasse, int ist ein Skalar. Und dies ist einer der Stellen, an denen dieser Unterschied nicht egal ist.</p>
<pre><code class="language-cpp">int i = 3;
int i(3);
</code></pre>
<p>Beide Varianten sind semantisch absolut identisch (Letzteres ist nur furchtbar weil unleserlich... man kann mit der Vereinheitlichung auch übertreiben; an vielen Stellen habe ich echte Schwierigkeiten, dies auf Anhieb von Funktionsdeklarationen zu unterscheiden. Und eine Schreibweise, die dazu führt, dass ich das Ganze eine ganze Sekunde länger betrachten muss, ist schlecht, denn das ist zu lange, wenn man Code nur überfliegen will).</p>
<p>bladerunner10 schrieb:</p>
<blockquote>
<p>Naja, so ganz das gleiche ist es wohl nicht. Sonst<br />
ware dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p(new MyClass);
</code></pre>
<p>ja da gleiche wie dies</p>
<pre><code class="language-cpp">std::auto_ptr&lt;MyClass&gt; p = new MyClass;
</code></pre>
<p>Letzteres ist aber nicht möglich, da der Konstruktor von std::auto_ptr&lt;&gt; ja<br />
'explicit' ist.</p>
</blockquote>
<p>Das erste ist direkte Initialisierung, das zweite Copy-Initialisierung. Und letzteres ist mit auto_ptr eben nicht möglich (gewollt, denn man will ja nicht versehentlich Zeiger in auto_ptr stecken; das sollte immer ganz bewusst erfolgen). Das ist auch nichts besonderes, für jeden anderen vernünftigen Smartpointer gilt dies ganz genauso.</p>
<p>Strolch schrieb:</p>
<blockquote>
<p>Der auto_ptr ist in C++0x eh deprecated. Nicht ohne Grund! <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>Natürlich erfolgt so etwas nicht ohne Grund, der wurde aber hier gar nicht genannt.</p>
<p>Der Standard sagt nicht viel zu auto_ptr_ref aus mehreren Gründen: einerseits handelt es sich im Prinzip um ein Implementationsdetail; andererseits hat es offensichtlich auch im Standardkomitee lange gedauert, bis die Funktionsweise von auto_ptr wirklich verstanden wurde. Fakt ist schließlich auch, das keiner der großen Compiler (die ich daraufhin mal unter die Lupe genommen habe: msvc, bcb, g++ jeweils in verschiedenen Versionen), auto_ptr tatsächlich korrekt und sicher umsetzt - die Fehler variieren allerdings zwischen den Compilern und Versionen. Umgekehrt sollte das allerdings nicht zu dem Trugschluss verleiten, auto_ptr wäre etwas gefährliches und besser zu vermeiden - dem ist trotz dieser Bugs im Allgemeinen nicht so: für die Zwecke, für die auto_ptr primär gedacht ist, gibt es gegenwärtig keine bessere Alternative. Es ist aber eben auch kein Smartpointer für alles, wie etwa shared_ptr, den man im Allgemeinen ohne Bedenken einsetzen kann (wenn man ggf. eine gewisse Ineffizienz in Kauf nimmt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547268</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Jul 2008 17:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 18:58:18 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Das erste ist direkte Initialisierung, das zweite Copy-Initialisierung. Und letzteres ist mit auto_ptr eben nicht möglich (gewollt, denn man will ja nicht versehentlich Zeiger in auto_ptr stecken; das sollte immer ganz bewusst erfolgen). Das ist auch nichts besonderes, für jeden anderen vernünftigen Smartpointer gilt dies ganz genauso.</p>
</blockquote>
<p>Das zweite soll eine Copy-Initialisierung sein? Eine Copy-Initialisierung geht auch bei auto_ptr. Man kann nur eben kein auto_ptr-Objekt mit irgendeinem Objekt eines anderen Typs initialisieren. Da der Konstruktor als explicit deklariert ist gibt es keine Standardumwandlung, daher ist die die zweite Codezeile einfach ein Fehler.</p>
<p>Das wäre z.B. auch bei</p>
<pre><code class="language-cpp">int i = 3.3;
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::string s = &quot;Hallo!&quot;;
</code></pre>
<p>oder jeder beliebigen anderen Klasse der Fall, wenn es keine entsprechende Standardumwandlung in das benötigte Format gäbe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547312</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Mon, 14 Jul 2008 18:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 19:39:35 GMT]]></title><description><![CDATA[<p>Kritiker schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Das erste ist direkte Initialisierung, das zweite Copy-Initialisierung. Und letzteres ist mit auto_ptr eben nicht möglich (gewollt, denn man will ja nicht versehentlich Zeiger in auto_ptr stecken; das sollte immer ganz bewusst erfolgen). Das ist auch nichts besonderes, für jeden anderen vernünftigen Smartpointer gilt dies ganz genauso.</p>
</blockquote>
<p>Das zweite soll eine Copy-Initialisierung sein? Eine Copy-Initialisierung geht auch bei auto_ptr. Man kann nur eben kein auto_ptr-Objekt mit irgendeinem Objekt eines anderen Typs initialisieren.</p>
</blockquote>
<p>Schön, dass einer aufpasst. Ich hätte schreiben sollen: /* Edit: etwas anderes, hab grad keine Lust, über die genaue Formulierung nachzudenken */.<br />
Edit 2: Deine Formulierung ist ja auch nicht ganz korrekt. Man kann ja auto_ptr implizit aus anderen (verwandten) auto_ptr (unter bestimmten Umständen) initialisieren.</p>
<pre><code class="language-cpp">struct B {}; struct D : B {};
auto_ptr&lt;D&gt; p(new D);
auto_ptr&lt;B&gt; q = p; // ok
</code></pre>
<p>Entscheidend für die Korrektheit beider Formulierung ist, dass wir genauer spezifizieren, um welche Quelltypen es gehen soll.</p>
<p>Die genaue Sprachregelung ist ohnehin insignifikant, wenn das Prinzip verstanden wurde. In problematischen Fällen kann es nützlich sein, verschiedene äquivalente Formulierungen zu kennen. Um etwa zu erklären warum in</p>
<pre><code class="language-cpp">struct B {}; struct D : B {};
auto_ptr&lt;D&gt; D_src();
auto_ptr&lt;B&gt; p1(D_src()); //(1)
auto_ptr&lt;D&gt; p1=D_src(); //(2)
</code></pre>
<p>(1), aber nicht (2) möglich ist. Es existiert ja keine Konvertierungssequenz von rvalue-auto_ptr&lt;D&gt; in lvalue-auto_ptr&lt;B&gt;. Das ist im Grunde der einzige prinzipiell (wenn wir nicht Compiler-Magie unterstellen wollen) unheilbare Fehler im auto_ptr-Design.</p>
<p>Kritiker schrieb:</p>
<blockquote>
<p>Da der Konstruktor als explicit deklariert ist gibt es keine Standardumwandlung, daher ist die die zweite Codezeile einfach ein Fehler.</p>
</blockquote>
<p>Wenn wir ganz genau sein wollen, muss es implizite Umwandlung heißen (die dann nicht möglich ist). Eine Standardumwandlung beinhaltet ohnehin nie den Aufruf eines Konstruktors oder Umwandlungsoperators.</p>
<blockquote>
<p>Das wäre z.B. auch bei</p>
<pre><code class="language-cpp">int i = 3.3;
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::string s = &quot;Hallo!&quot;;
</code></pre>
<p>oder jeder beliebigen anderen Klasse der Fall, wenn es keine entsprechende Standardumwandlung in das benötigte Format gäbe.</p>
</blockquote>
<p>Ganz recht (implizite Umwandlung im zweiten Fall).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547335</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Jul 2008 19:39:35 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 21:03:17 GMT]]></title><description><![CDATA[<p>Natürlich, es heißt &quot;implizite Umwandlung&quot;. War &quot;etwas&quot; schlampig von mir. <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>Stecke jetzt nicht so tief im Thema drin, aber bist du dir sicher, dass der Fall (2) in deinem Beispiel nicht funktioniert? Sieht eigentlich plausibel aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547384</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Mon, 14 Jul 2008 21:03:17 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Mon, 14 Jul 2008 23:44:35 GMT]]></title><description><![CDATA[<p>Kritiker schrieb:</p>
<blockquote>
<p>Natürlich, es heißt &quot;implizite Umwandlung&quot;. War &quot;etwas&quot; schlampig von mir. <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>Stecke jetzt nicht so tief im Thema drin, aber bist du dir sicher, dass der Fall (2) in deinem Beispiel nicht funktioniert? Sieht eigentlich plausibel aus.</p>
</blockquote>
<p>Plausibel sieht es aus, und es wäre schön, wenn es funktionierte (um nackte Zeiger besser zu imitieren).</p>
<pre><code class="language-cpp">struct B {}; struct D : B {};
auto_ptr&lt;B&gt; B_src();
auto_ptr&lt;D&gt; D_src();
auto_ptr&lt;B&gt; p(B_src()); //(1) ok, direkte Initialisierung
auto_ptr&lt;B&gt; q(D_src()); //(2) ok, direkte Initialisierung
auto_ptr&lt;B&gt; r=B_src();  //(3) ok, Copy-Initialisierung vom gleichen Typ
auto_ptr&lt;B&gt; s=D_src();  //(4) Fehler, Copy-Initialisierung von nicht verwandtem Typ, bräuchte Konvertierungssequenz mit 2 Konvertierungsfunktionen
</code></pre>
<p>(1) ist Problemlos: es werden alle Konstruktoren untersucht, und nur<br />
auto_ptr&lt;B&gt;::auto_ptr(auto_ptr_ref&lt;B&gt;) kommt in Frage: dazu muss der initialisierende Ausdruck in ein auto_ptr_ref&lt;B&gt; konvertiert werden, wozu der entsprechende Konvertierungsoperator auto_ptr&lt;B&gt;::operator auto_ptr_ref&lt;B&gt; benutzt wird.<br />
(2) ist ebenso Problemlos, der gleiche Konstruktor wird benutzt, nur der aufgerufene Konvertierungsoperator ist hier auto_ptr&lt;D&gt;::operator auto_ptr_ref&lt;B&gt;<br />
(3) ist analog zu (1) <em>weil</em> der initialisierende Ausdruck vom gleichen Typ ist (cv-Qualifizierung ist egal und auch ein abgeleiteter Typ des Zieltyps fiele unter diese Regel)<br />
(4) wird anders behandelt: hier muss der initialisierende Ausdruck in auto_ptr&lt;B&gt; konvertiert werden, aber ein temporäres Objekt (bzw. rvalue) entsteht nur durch Konstruktoraufruf (d.h. Konvertierungsoperatoren werden nur berücksichtigt, wenn sie in cv Base&amp; bzw. cv Derived&amp; konvertieren - deshalb ist der Konvertierungsoperator auto_ptr&lt;T&gt;::operator auto_ptr&lt;U&gt; nutzlos und wird niemals aufgerufen). Das ist anders als die anderen Fälle, dort war der Zieltyp der Konvertierung jeweils auto_ptr_ref&lt;B&gt; und das temporäre Objekt entstand durch eine Operatorfunktion. Hier bräuchten wir nun 2 Funktionsaufrufe für die Konvertierung (erst den Konvertierungsoperator auto_ptr_ref, dann den Konstruktor) und das ist unzulässig. All die anderen Konstruktoren kommen nicht in Frage, weil die nur mit modifizierbaren Referenzen arbeiten und demzufolge nicht an das rvalue-Argument binden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547397</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Jul 2008 23:44:35 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Tue, 15 Jul 2008 10:11:29 GMT]]></title><description><![CDATA[<p>OK, jetzt weiß ich was du meinst. War nur leicht verwirrt, weil der Quelltext in deinem Beitrag so aussah:</p>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct B {}; struct D : B {};
auto_ptr&lt;D&gt; D_src();
auto_ptr&lt;B&gt; p1(D_src()); //(1)
auto_ptr&lt;D&gt; p1=D_src(); //(2)
</code></pre>
</blockquote>
<p>Du meintest hier wohl im Fall (2) auto_ptr&lt;B&gt;.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Edit 2: Deine Formulierung ist ja auch nicht ganz korrekt. Man kann ja auto_ptr implizit aus anderen (verwandten) auto_ptr (unter bestimmten Umständen) initialisieren.</p>
<pre><code class="language-cpp">struct B {}; struct D : B {};
auto_ptr&lt;D&gt; p(new D);
auto_ptr&lt;B&gt; q = p; // ok
</code></pre>
</blockquote>
<p>Da bin ich mir auch nicht sicher ob das OK ist. Es entspricht ja mehr oder weniger deinem Fall (2).</p>
<p>Noch verwirrender ist, dass z.B. MVSC++ auch die Variante (2) &quot;schluckt&quot; und korrekt ausführt. Während z.B. MinGW genau den von dir angedeuteten Fehler aufzeigt (no matching function call for ... ).</p>
<p>Hab kurz jeweils die Headerdateien (memory) überflogen um Unterschiede zu erkennen, was mir nicht gelungen ist. Vielleicht hilft jemand aus, der das schon weiß?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547566</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Tue, 15 Jul 2008 10:11:29 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Tue, 15 Jul 2008 10:19:47 GMT]]></title><description><![CDATA[<p>Vermutlich wird das ganz von Mvc++ einfach falsch interpretiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547570</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 15 Jul 2008 10:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Tue, 15 Jul 2008 11:13:10 GMT]]></title><description><![CDATA[<p>Kritiker schrieb:</p>
<blockquote>
<p>OK, jetzt weiß ich was du meinst. War nur leicht verwirrt, weil der Quelltext in deinem Beitrag so aussah:</p>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct B {}; struct D : B {};
auto_ptr&lt;D&gt; D_src();
auto_ptr&lt;B&gt; p1(D_src()); //(1)
auto_ptr&lt;D&gt; p1=D_src(); //(2)
</code></pre>
</blockquote>
<p>Du meintest hier wohl im Fall (2) auto_ptr&lt;B&gt;.</p>
</blockquote>
<p>*kopf gegen wand* ja, genau - schon wieder nicht richtig hingeschaut.</p>
<p>Kritiker schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Edit 2: Deine Formulierung ist ja auch nicht ganz korrekt. Man kann ja auto_ptr implizit aus anderen (verwandten) auto_ptr (unter bestimmten Umständen) initialisieren.</p>
<pre><code class="language-cpp">struct B {}; struct D : B {};
auto_ptr&lt;D&gt; p(new D);
auto_ptr&lt;B&gt; q = p; // ok
</code></pre>
</blockquote>
<p>Da bin ich mir auch nicht sicher ob das OK ist. Es entspricht ja mehr oder weniger deinem Fall (2).</p>
</blockquote>
<p>Keineswegs. Hier ist der initialisierende Ausdruck ein modifizierbares lvalue, dafür existiert ein entsprechender Konvertierungskonstruktor:</p>
<pre><code class="language-cpp">template&lt;class X&gt;
template&lt;class Y&gt; auto_ptr&lt;X&gt;::auto_ptr(auto_ptr&lt;Y&gt;&amp;) throw();
</code></pre>
<p>mit X=B und Y=D<br />
Der ist aber im Falle eines rvalues nicht nutzbar (außer man benutzt Compilererweiterungen, die rvalues auch an modifizierbare Referenzen binden, kann man im Übrigen auch bei msvc abstellen). Für rvalues bräuchten wir eine Referenz auf const (wollen wir nicht, dann geben wir const-Korrektheit auf) oder eben einen Umwandlungsoperator. Den Umwandlungsoperator haben wir zwar, nur wird der wegen der Regeln bzgl. Copy-Initialisierung, nie aufgerufen.<br />
Dies ist eben einer der klassischen Fälle, der die Einführung von rvalue-Referenzen mit motiviert hat (allgemein Move-Semantik); der andere wichtige Grund dort ist das Forwarding-Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547600</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 15 Jul 2008 11:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Tue, 15 Jul 2008 13:24:26 GMT]]></title><description><![CDATA[<p>Die Argumentation scheint schlüssig, dennoch hab ich das Problem, dass Microsoft beide Varianten schluckt (Lässt sich dann mittels den von dir erwähnten Compilererweiterungen erklären. P.S. weißt du zufällig wie man die abstellt?) und z.B. MinGW aber auch g++ unter Debian keine der beiden Varianten kompilieren kann.</p>
<p>Daher eine Zwischenfrage:</p>
<p>Kannst du bei dir den folgenden Code tatsächlich kompilieren?</p>
<pre><code class="language-cpp">struct B {}; struct D : B {};
auto_ptr&lt;D&gt; p(new D);
auto_ptr&lt;B&gt; q = p; // ok
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1547689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547689</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Tue, 15 Jul 2008 13:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration mit new on Wed, 16 Jul 2008 16:31:11 GMT]]></title><description><![CDATA[<p>Kritiker schrieb:</p>
<blockquote>
<p>Kannst du bei dir den folgenden Code tatsächlich kompilieren?</p>
<pre><code class="language-cpp">struct B {}; struct D : B {};
auto_ptr&lt;D&gt; p(new D);
auto_ptr&lt;B&gt; q = p; // ok
</code></pre>
</blockquote>
<p>Nein. Und ich habe das Gefühl, immer noch nicht ganz verstanden zu haben, wie auto_ptr funktioniert, bzw. warum es das nicht tut. Kommando zurück hinsichtlich ders Umwandlungsoperators auto_ptr&lt;T&gt; - der wird schon berücksichtigt (und wenn ich nicht noch mal - zu oberflächlich - im Standard nachgelesen hätte, hätte ich diesen Mist auch nicht zusammen geschrieben). Grundsätzlich müssen wir einfach alle denkbaren Konstallationen durch gehen. Die Initialisierung kann direkt oder als Copy-Initialisierung erfolgen. Der initialisierende Ausdruck kann ein l- oder rvalue sein. Schlielich kann es sich um einen verwandten Typ handeln oder etwas anderes. Zudem kann der der Ausdruck const-qualifiziert sein oder nicht. Macht insgesamt 16 Kombinationen; idealerweise sollten alle Kombinationen mit modifizierberem Initialiserer funktionieren, alle mit const sollte der Compiler zurückweisen.</p>
<pre><code class="language-cpp">struct B {}; struct D : B {};
typedef auto_ptr&lt;B&gt; aB;
typedef auto_ptr&lt;D&gt; aD;
aB&amp; laB();
aB raB();
const aB&amp; claB();
const aB craB();
aD&amp; laD();
aD raD();
const aD&amp; claD();
const aD craD();
// Bei direkter Initialisierung oder Copy-Initialisierung von gleichem oder abgeleitetem Typ:
// untersuche alle Konstruktoren des Zieltyps und wähle den besten aus (Überladungsauflösung)
// sonst (Copy-Initialisierung aus anderen Typen):
// Konvertiere den Initialisierer in den Zieltypen und benutze das Ergebnis zur
// direkten Initialisierung des Objektes
aB p1(laB()); // direkt; auto_ptr&lt;B&gt;::auto_ptr(auto_ptr&amp;) oder
              //         auto_ptr&lt;B&gt;::auto_ptr(auto_ptr_ref&lt;B&gt;)
              // der copy-ctor ist die bessere Überladung..ok
aB p2=laB();  // copy;   wie p1
aB p3(raB()); // direkt; auto_ptr&lt;B&gt;::auto_ptr(auto_ptr_ref&lt;B&gt;)
              //   erfordert Umwandlung in auto_ptr_ref&lt;B&gt; über die Operatorfunktion..ok
aB p4=raB();  // copy(gleicher Typ);   wie p3
aB p5(laD()); // direkt; auto_ptr&lt;B&gt;::auto_ptr(auto_ptr&lt;D&gt;&amp;) oder
              //         auto_ptr&lt;B&gt;::auto_ptr(auto_ptr_ref&lt;B&gt;)
              // die erste Variante ist die bessere Überladung..ok
aB p6=laD();  // copy - Konvertierung nach aB
              //     1. user-defined conversion mit auto_ptr&lt;B&gt;::auto_ptr(auto_ptr&lt;D&gt;&amp;);
              //     2. user-defined conversion mit auto_ptr&lt;D&gt;::operator auto_ptr&lt;B&gt;
              // mehrdeutig - die Frage ob und wie das Ergebnis weiterverwendet werden kann, ist für die Überladungsauflösung hier unerheblich
              // eine user-defined conversion sequence ist nur dann besser als eine andere, wenn beide die gleiche Funktion bzw. den gleichen
              // Konstruktor benutzen und die Standardkonvertierungssequenz nach dem Aufruf der Funktion bzw. des Konstruktors besser ist
              // Beides trifft hier nicht zu: die Funktionen sind unterschiedlich und die anschließende Sequenz ist jeweils die der identischen Konvertierung, also gleich
aB p7(raD()); // direkt; auto_ptr&lt;B&gt;::auto_ptr(auto_ptr_ref&lt;B&gt;)..ok
aB p8=raD();  // copy - Konvertierung nach aB
              //    einzig möglich: per auto_ptr&lt;D&gt;::operator auto_ptr&lt;B&gt;
              // das Rgebnis wird zur direkten Initialisierung (analog p3) benutzt..ok
aB p9(claB()); // kein Kandidat..ok
aB p10=claB(); // kein Kandidat..ok
aB p11(craB());// kein Kandidat..ok
aB p12=craB(); // kein Kandidat..ok
aB p13(claD());// kein Kandidat..ok
aB p14=claD(); // kein Kandidat..ok
aB p15(craD());// kein Kandidat..ok
aB p16=craD(); // kein Kandidat..ok
</code></pre>
<p>So gesehen ist der der Templatekonstruktor, der bei p6 im Weg ist, eigentlich überflüssig, für die Initialisierung von p5 ist er nicht zwingend erforderlich.<br />
Aber wahrscheinlich ist bloß wieder ein Denkfehler drin. Den Zuweisungsoperator müsste man zusätzlich untersuchen.</p>
<p>Edit: Comeau akzeptiert p8 nur im relaxed mode - der Wortlaut im Standard (8.5/14) ist imo aber eindeutig genug</p>
<pre><code>The semantics of initializers are as follows. The destination type is the type of the object or reference being
initialized and the source type is the type of the initializer expression. The source type is not defined when
the initializer is brace-enclosed or when it is a parenthesized list of expressions.

— If the destination type is a reference type, see 8.5.3.

— If the destination type is an array of characters or an array of wchar_t, and the initializer is a string literal,
  see 8.5.2.

— Otherwise, if the destination type is an array, see 8.5.1.

— If the destination type is a (possibly cv-qualified) class type:

    — If the class is an aggregate (8.5.1), and the initializer is a brace-enclosed list, see 8.5.1.

    — If the initialization is direct-initialization, or if it is copy-initialization where the cv-unqualified version
      of the source type is the same class as, or a derived class of, the class of the destination, constructors
      are considered. The applicable constructors are enumerated (13.3.1.3), and the best one is
      chosen through overload resolution (13.3). The constructor so selected is called to initialize the
      object, with the initializer expression(s) as its argument(s). If no constructor applies, or the overload
      resolution is ambiguous, the initialization is ill-formed.

    — Otherwise (i.e., for the remaining copy-initialization cases), user-defined conversion sequences that
      can convert from the source type to the destination type or (when a conversion function is used) to a
      derived class thereof are enumerated as described in 13.3.1.4, and the best one is chosen through
      overload resolution (13.3). If the conversion cannot be done or is ambiguous, the initialization is
      ill-formed. The function selected is called with the initializer expression as its argument; if the function
      is a constructor, the call initializes a temporary of the destination type. The result of the call
      (which is the temporary for the constructor case) is then used to direct-initialize, according to the
      rules above, the object that is the destination of the copy-initialization. In certain cases, an implementation
      is permitted to eliminate the copying inherent in this direct-initialization by constructing
      the intermediate result directly into the object being initialized; see 12.2, 12.8.

— Otherwise, if the source type is a (possibly cv-qualified) class type, conversion functions are considered.
  The applicable conversion functions are enumerated (13.3.1.5), and the best one is chosen through overload
  resolution (13.3). The user-defined conversion so selected is called to convert the initializer
  expression into the object being initialized. If the conversion cannot be done or is ambiguous, the
  initialization is ill-formed.

— Otherwise, the initial value of the object being initialized is the (possibly converted) value of the initializer
  expression. Standard conversions (clause 4) will be used, if necessary, to convert the initializer
  expression to the cv-unqualified version of the destination type; no user-defined conversions are considered.
  If the conversion cannot be done, the initialization is ill-formed. [Note: an expression of type
  “cv1 T” can initialize an object of type “cv2 T” independently of the cv-qualifiers cv1 and cv2.
      int a;
      const int b = a;
      int c = b;
  —end note]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1547891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547891</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 16 Jul 2008 16:31:11 GMT</pubDate></item></channel></rss>