<?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[Fordert Copy-Initialization auch Copy-Construction?]]></title><description><![CDATA[<p>Ich habe zur Zeit einen Disput mit einem Kollegen meinerseits. Es geht darum, ob eine Copy-Initialization aus einem temporären Objekt einen Copy-Constructor erfordert, auch wenn dieser wegoptimiert wird. Ich meine ja, er meint nein. Interessanterweise sehen auch unsere Compiler das unterschiedlich. Wenn der Copy-Constructor direkt unbenutzbar gemacht wird, werfen beide einen Fehler (was meine Meinung bestätigt), über Vererbung jedoch sehen sie es etwas anders.</p>
<p>Folgendes Beispiel compiliert keiner von beiden:</p>
<pre><code class="language-cpp">struct X
{
    X() {}
private:
    X( X const&amp; );
    X&amp; operator=( X const&amp; );
};

int main()
{
    X x = X();
}
</code></pre>
<p>Folgendes Beispiel wird jedoch vom MSVC++ 8.0 übersetzt, vom G++ 3.3.5 und G++ 4.1 jedoch nicht:</p>
<pre><code class="language-cpp">#include &lt;boost/noncopyable.hpp&gt;

struct X: boost::noncopyable
{
    X() {}
};

int main()
{
    X x = X();
}
</code></pre>
<p>Wer hat Recht und warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185311/fordert-copy-initialization-auch-copy-construction</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 03:06:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185311.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 Jun 2007 23:12:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fordert Copy-Initialization auch Copy-Construction? on Sat, 23 Jun 2007 23:12:57 GMT]]></title><description><![CDATA[<p>Ich habe zur Zeit einen Disput mit einem Kollegen meinerseits. Es geht darum, ob eine Copy-Initialization aus einem temporären Objekt einen Copy-Constructor erfordert, auch wenn dieser wegoptimiert wird. Ich meine ja, er meint nein. Interessanterweise sehen auch unsere Compiler das unterschiedlich. Wenn der Copy-Constructor direkt unbenutzbar gemacht wird, werfen beide einen Fehler (was meine Meinung bestätigt), über Vererbung jedoch sehen sie es etwas anders.</p>
<p>Folgendes Beispiel compiliert keiner von beiden:</p>
<pre><code class="language-cpp">struct X
{
    X() {}
private:
    X( X const&amp; );
    X&amp; operator=( X const&amp; );
};

int main()
{
    X x = X();
}
</code></pre>
<p>Folgendes Beispiel wird jedoch vom MSVC++ 8.0 übersetzt, vom G++ 3.3.5 und G++ 4.1 jedoch nicht:</p>
<pre><code class="language-cpp">#include &lt;boost/noncopyable.hpp&gt;

struct X: boost::noncopyable
{
    X() {}
};

int main()
{
    X x = X();
}
</code></pre>
<p>Wer hat Recht und warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312512</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Sat, 23 Jun 2007 23:12:57 GMT</pubDate></item><item><title><![CDATA[Reply to Fordert Copy-Initialization auch Copy-Construction? on Sat, 23 Jun 2007 23:30:57 GMT]]></title><description><![CDATA[<p>Das im Ausgangsposting beschriebene Problem wird noch schlimmer, wenn man ein template</p>
<pre><code class="language-cpp">template &lt;typname T&gt; class C
{
   void f()
   {
      T t = T();
   }
};
</code></pre>
<p>verwenden will. Instanziert mit int geht es gut, mit von boost::noncopyable abgeleiteter Klasse aber nicht.</p>
<p>Die alternative für f()</p>
<pre><code class="language-cpp">void f()
   {
      T t;
   }
</code></pre>
<p>hinterlässt bei int die lokale Variable t uninitialsiert und T t(); schreiben geht nicht bei Klassen mit default Konstruktoren.</p>
<p>Grüße<br />
Dieter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312519</guid><dc:creator><![CDATA[tadi]]></dc:creator><pubDate>Sat, 23 Jun 2007 23:30:57 GMT</pubDate></item><item><title><![CDATA[Reply to Fordert Copy-Initialization auch Copy-Construction? on Sun, 24 Jun 2007 01:06:08 GMT]]></title><description><![CDATA[<p>du hast recht und es steht in 12.2/1: &quot;Even when the creation of the temporary object is avoided (12.8), all the semantic restrictions must be respected as if the temporary object was created.&quot;, und laut 8.5/14/4/3 wird hier ein temporäres objekt erzeugt, dass dann für die direct-initialization verwendet wird. bei <code>X x = X()</code> wird zwar kein temporäres objekt erzeugt (8.5/14/4/2), aber wenn der es keinen passenden ctor gibt, dann funktioniert es auch nicht.</p>
<p>/edit:<br />
msvc hat einen bug, weil sie 8.5/14/4/2 falsch interpretieren. siehe <a href="http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101735" rel="nofollow">http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101735</a><br />
vielleicht hat sie auch nur 12.3.1/2 verwirrt <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/1312530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312530</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sun, 24 Jun 2007 01:06:08 GMT</pubDate></item><item><title><![CDATA[Reply to Fordert Copy-Initialization auch Copy-Construction? on Sun, 24 Jun 2007 01:34:55 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Ich habe zur Zeit einen Disput mit einem Kollegen meinerseits. Es geht darum, ob eine Copy-Initialization aus einem temporären Objekt einen Copy-Constructor erfordert, auch wenn dieser wegoptimiert wird. Ich meine ja, er meint nein.</p>
</blockquote>
<p>Du hast recht, wie auch schon erklärt wurde.</p>
<blockquote>
<p>Interessanterweise sehen auch unsere Compiler das unterschiedlich. Wenn der Copy-Constructor direkt unbenutzbar gemacht wird, werfen beide einen Fehler (was meine Meinung bestätigt), über Vererbung jedoch sehen sie es etwas anders.</p>
<p>Folgendes Beispiel compiliert keiner von beiden:</p>
<p>Folgendes Beispiel wird jedoch vom MSVC++ 8.0 übersetzt, vom G++ 3.3.5 und G++ 4.1 jedoch nicht:</p>
<pre><code class="language-cpp">#include &lt;boost/noncopyable.hpp&gt;

struct X: boost::noncopyable
{
    X() {}
};

int main()
{
    X x = X();
}
</code></pre>
<p>Wer hat Recht und warum?</p>
</blockquote>
<p>Ein Fehler des MSVC, allerdings kein Problem von 8.5<br />
In diesem Falle hat X ja einen geeigneten Copy-Konstruktor, der auch public ist (da implizit deklariert) - nur kann dieser nicht definiert werden. Die Bemerkung in 12.8/7</p>
<blockquote>
<p>[Note: the copy constructor is implicitly defined even if the implementation elided its use (12.2). ]</p>
</blockquote>
<p>ist da sehr eindeutig. Dass der Compiler durchaus nach einem passenden Copy-Konstruktor sucht erkennt man leicht, wenn man eine eigene Basisklasse geeignet schreibt:</p>
<pre><code class="language-cpp">class A
{
    A(A&amp;);
    void operator=(A&amp;);
};
struct X : A
{
    X() {}
};

int main()
{
    X x = X();
}
</code></pre>
<p>Hier verweigert auch msvc die Zusammenarbeit.</p>
<p>Edit: Ganz zum Schluss wird das auch hinter obigem Link erklärt, ich hatte auf die zitierten Stellen des Standards geschaut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312543</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 24 Jun 2007 01:34:55 GMT</pubDate></item></channel></rss>