<?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[Kann ich einen noexcept Move-Konstruktor verlangen?]]></title><description><![CDATA[<p>Wenn ich ein allgemeines Klassentemplate schreibe, ist es sinnvoll zu verlangen, dass der Move-Konstruktor noexcept ist?</p>
<p>Ich kann mir keinen sinnvollen Move-Konstruktor vorstellen, der eine Exception wirft.</p>
<p>Wenn ich davon ausgehen könnte, hätte das viele Vorteile für mich. Einerseits wäre die Implementierung um einiges einfacher und ich könnte das Interface schöner gestalten (queue::pop() könnte eine rvalue auf das gepoppte Element zurückgeben).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317807/kann-ich-einen-noexcept-move-konstruktor-verlangen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 22:33:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317807.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 21 Jun 2013 07:19:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann ich einen noexcept Move-Konstruktor verlangen? on Fri, 21 Jun 2013 07:19:06 GMT]]></title><description><![CDATA[<p>Wenn ich ein allgemeines Klassentemplate schreibe, ist es sinnvoll zu verlangen, dass der Move-Konstruktor noexcept ist?</p>
<p>Ich kann mir keinen sinnvollen Move-Konstruktor vorstellen, der eine Exception wirft.</p>
<p>Wenn ich davon ausgehen könnte, hätte das viele Vorteile für mich. Einerseits wäre die Implementierung um einiges einfacher und ich könnte das Interface schöner gestalten (queue::pop() könnte eine rvalue auf das gepoppte Element zurückgeben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332982</guid><dc:creator><![CDATA[muvvel]]></dc:creator><pubDate>Fri, 21 Jun 2013 07:19:06 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich einen noexcept Move-Konstruktor verlangen? on Fri, 21 Jun 2013 07:25:14 GMT]]></title><description><![CDATA[<p>Nicht unbedingt. Ein Move-Ctor kann sehr wohl Exceptions schmeissen, z.B. bei Debug/Logging Output, Caches, oder internem Locking.<br />
Darum gibt es auch std::move_if_noexcept.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332984</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 21 Jun 2013 07:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich einen noexcept Move-Konstruktor verlangen? on Fri, 21 Jun 2013 07:37:43 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Debug/Logging Output</p>
</blockquote>
<p>Die Exception würde ich fangen und ignorieren. Es macht keinen Sinn, dass weiterzuleiten. Logging gehört eindeutig nicht zur Aufgabe des Movekonstruktors, auch weil Ort und Anzahl der Aufrufe ein Implementierungsdetail ist.</p>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Caches</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>internem Locking.</p>
</blockquote>
<p>Das andere Objekt ist tot und unbenutzt und das eigene ist neu. Da braucht es kein Locking.</p>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Darum gibt es auch std::move_if_noexcept.</p>
</blockquote>
<p>Das gibt es wegen Alt-Code, der nur einen Kopierkonstruktor bereitstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332986</guid><dc:creator><![CDATA[movvel]]></dc:creator><pubDate>Fri, 21 Jun 2013 07:37:43 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich einen noexcept Move-Konstruktor verlangen? on Fri, 21 Jun 2013 07:56:09 GMT]]></title><description><![CDATA[<p>muvvel schrieb:</p>
<blockquote>
<p>Wenn ich ein allgemeines Klassentemplate schreibe, ist es sinnvoll zu verlangen, dass der Move-Konstruktor noexcept ist?</p>
</blockquote>
<p>Nein. Eher nicht.</p>
<p>muvvel schrieb:</p>
<blockquote>
<p>Ich kann mir keinen sinnvollen Move-Konstruktor vorstellen, der eine Exception wirft.</p>
</blockquote>
<p>Stell dir ein pair&lt;T,U&gt; vor, wo T move-optimiert ist, U aber nicht. Der Kopierkonstruktor von U schmeißt ggf eine Ausnahme. pair&lt;T,U&gt; wird dann einen potentiell ausnahmewerfenden Move-Konstruktor besitzen. Als Nutzer kannst du dir dann überlegen: Möchte ich starke Ausnahmesicherheit? Dann muss ich std::move_if_noexcept verwenden. Reicht mir die &quot;basic guarantee&quot;? Dann kann ich std::move verwenden und nehme damit in Kauf, dass bei einem fehlgeschlagenen Move die Originalinstanz ggf nicht mehr so aussieht, wie vorher.</p>
<p>std::vector fällt ähnlich auf das Kopieren beim Vergrößern des Vektors zurück, wenn seine Elemente nicht noexcept-movable sind aber dafür eine Kopierfunktion anbieten. Damit bietet z.B. push_back in solchen Fällen auch die starke Ausnahmesicherheit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332990</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 21 Jun 2013 07:56:09 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich einen noexcept Move-Konstruktor verlangen? on Sat, 22 Jun 2013 20:35:31 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Stell dir ein pair&lt;T,U&gt; vor, wo T move-optimiert ist, U aber nicht. Der Kopierkonstruktor von U schmeißt ggf eine Ausnahme. pair&lt;T,U&gt; wird dann einen potentiell ausnahmewerfenden Move-Konstruktor besitzen.</p>
</blockquote>
<p>Das ist Alt-Code. Da gehört U gefixt (und jede alte Klasse (die copyable ist) besitzt einen (implizit generierten) Move-Konstruktor, da musst du nicht ein exotisches Beispiel bringen).</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Als Nutzer kannst du dir dann überlegen: Möchte ich starke Ausnahmesicherheit? Dann muss ich std::move_if_noexcept verwenden. Reicht mir die &quot;basic guarantee&quot;? Dann kann ich std::move verwenden und nehme damit in Kauf, dass bei einem fehlgeschlagenen Move die Originalinstanz ggf nicht mehr so aussieht, wie vorher.</p>
</blockquote>
<p>Das Problem ist:</p>
<blockquote>
<p>Exception Safety Affects a Class's Design</p>
</blockquote>
<p>Ich müsste meine Klasse verpimpeln <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="🙂"
    /> (mit dem PIMPL-Idiom versehen) um &quot;strong guarantee&quot; zu erreichen. std::move_if_noexcept alleine reicht leider nicht immer aus.</p>
<p>Auf der anderen Seite könnte ich meine Klasse auf Geschwindigkeit optimieren und trotzdem die strong guarantee bereitstellen, vorausgesetzt der Move-Konstruktor ist nothrow. Ist es das wert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333418</guid><dc:creator><![CDATA[muvvel]]></dc:creator><pubDate>Sat, 22 Jun 2013 20:35:31 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich einen noexcept Move-Konstruktor verlangen? on Sun, 23 Jun 2013 09:38:55 GMT]]></title><description><![CDATA[<p>muvvel schrieb:</p>
<blockquote>
<p>da musst du nicht ein exotisches Beispiel bringen).</p>
</blockquote>
<p>Dass das &quot;exotisches&quot; sei, würde ich nicht behaupten. Es ist ein Beispiel aus den Veröffentlichungen des Komitees, Veröffentlichungen, die zur Einführung von noexcept und dazu geführt haben, ausnahmewerfende Move-Konstruktoren zu tolerieren. Wenn du eine Klasse aus teils move-optimierten Typen und teils &quot;Legacy-Typen&quot; baust, die keinen move-ctor haben abar dafür einen ausnahmewerfenden Konstruktor, dann ist ein ausnahmefreies Moven eben nicht möglich, es sei denn, du bringst die Legacy-Typen (die z.B. aus einer ganz anderen Bibliothek kommen) selbst auf den neusten Stand. Würde man throwing Move-Ctors einfach verbieten, dann würde man in einigen Fällen, nämlich in denen, wo man die starke Garantie nicht benötigt, Performance verschenken, da<br />
alle &quot;Elemente&quot; kopiert werden müssten, obwohl einige davon vielleicht move-bar sind. So, wie es jetzt ist, ist es doch am besten. Kein nothrow-move-Zwang, aber dafür kann man den nothrow-Status per type_traits abfragen und ggf auf Kopieren zurückfallen, wenn man die strong guarantee braucht.</p>
<p>muvvel schrieb:</p>
<blockquote>
<p>Ist es das wert?</p>
</blockquote>
<p>Das kannst nur Du bewerten, solange du nicht konkreter wirst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333477</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 23 Jun 2013 09:38:55 GMT</pubDate></item></channel></rss>