<?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[Wann noexcept nutzen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in meiner Applikation momentan mehrere Model-Klassen deren Methoden meistens keine Exception werfen. Ist es sinnvoll diese mit noexcept zu deklarieren?</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332286/wann-noexcept-nutzen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 05:14:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332286.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 20 Apr 2015 10:25:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 10:25:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in meiner Applikation momentan mehrere Model-Klassen deren Methoden meistens keine Exception werfen. Ist es sinnvoll diese mit noexcept zu deklarieren?</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450945</guid><dc:creator><![CDATA[wannnoexcept]]></dc:creator><pubDate>Mon, 20 Apr 2015 10:25:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 10:55:45 GMT]]></title><description><![CDATA[<p>Wenn aus diesen Methoden <strong>garantiert</strong> keine Exceptions geworfen werden können (mit anderen Worten aus dem gesamten Call-Stack der jeweiligen Funktion) sehe ich persönlich keinen Grund warum Du nicht noexcept ranschreiben solltest.</p>
<p>Soweit ich das verstanden habe kann der Compiler dann Optimierungen vornehmen die er ansonsten nicht vornehmen könnte ABER sollte dort doch eine Exception rauskommen dann landest, wenn ich mich richtig erinnere im UB-Land.</p>
<p>P.S.:<br />
Move-Konstruktoren sollten nach Möglichkeit so entworfen werden, dass sie keine Exceptions werfen und damit als noexcept markiert werden können denn in STL -Containern wird nur move verwendet, wenn der move-konstruktor noexcept ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450948</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Mon, 20 Apr 2015 10:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 10:53:28 GMT]]></title><description><![CDATA[<p>wannnoexcept schrieb:</p>
<blockquote>
<p>ich habe in meiner Applikation momentan mehrere Model-Klassen deren Methoden meistens keine Exception werfen. Ist es sinnvoll diese mit noexcept zu deklarieren?</p>
</blockquote>
<p>&quot;no&quot; heißt nicht &quot;selten&quot;, sondern &quot;keine&quot;.</p>
<p>Das sollte man nicht einfach überall hinschreiben, wo aktuell keine Exceptions fliegen. Das kann sich schließlich mal ändern.</p>
<p>Hauptsächlich ist <code>noexcept</code> für Konstruktoren, Zuweisungsoperatoren und den Destruktor gedacht, um ausnahmesicheren, generischen Code effizienter zu machen. Zum Beispiel kann <code>std::vector</code> beim Vergrößern unnötige Kopien vermeiden, wenn die Elemente <code>noexcept</code> -movable sind.</p>
<p>Man kann <code>noexcept</code> zur Mikrooptimierung benutzen, weil der Compiler unter Umständen besseren Code generieren kann, wenn ein Aufruf garantiert nicht wirft.</p>
<p>(Sorry, den muss ich einfach hinschreiben: &quot;Ohne Ausnahme: noexcept lässt keine Exceptions zu&quot;.)</p>
<p>Ruvi schrieb:</p>
<blockquote>
<p>Soweit ich das verstanden habe kann der Compiler dann Optimierungen vornehmen die er ansonsten nicht vornehmen könnte ABER sollte dort doch eine Exception rauskommen dann landest, wenn ich mich richtig erinnere im UB-Land.</p>
</blockquote>
<p>Nö, das endet mit <code>std::terminate</code> . Der Stack darf vom Compiler abgeräumt werden, muss aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450949</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 20 Apr 2015 10:53:28 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 10:55:30 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Nö, das endet mit <code>std::terminate</code> . Der Stack darf vom Compiler abgeräumt werden, muss aber nicht.</p>
</blockquote>
<p>Ich kann es leider nicht testen VS hat noexcept noch nicht ordentlich implementiert, also wird std::terminate aufgerufen sobald eine Exception von einer noexcept Funktion geworfen wird?<br />
Oder meinst Du, dass die Exception die dort geworfen wird wahrscheinlich nicht gefangen wird und durch die Exception selbst std::terminate aufgerufen wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450952</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Mon, 20 Apr 2015 10:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 11:51:23 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>Ich kann es leider nicht testen VS hat noexcept noch nicht ordentlich implementiert, also wird std::terminate aufgerufen sobald eine Exception von einer noexcept Funktion geworfen wird?<br />
Oder meinst Du, dass die Exception die dort geworfen wird wahrscheinlich nicht gefangen wird und durch die Exception selbst std::terminate aufgerufen wird?</p>
</blockquote>
<p>Normalerweise geht das Programm bei einer exception dazu ueber, den ganzen Stack abzuraeumen und alle Destruktoren aufzurufen, bis man beim entsprechenden catch ist. Bei noexcept kann einfach sofort beendet werden und man spart sich dadurch die ganze Fehlerbehandlung und macht ggf. den Code schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450956</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Mon, 20 Apr 2015 11:51:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 15:09:41 GMT]]></title><description><![CDATA[<p>Hö?</p>
<p>D.h. bei noexcept werden Destruktoren nicht mehr aufgerufen?<br />
Das scheint mir jetzt auf den ersten Blick etwas, naja, komisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450992</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 20 Apr 2015 15:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 15:27:53 GMT]]></title><description><![CDATA[<p>Finde ich gar nicht komisch. Bestenfalls kann der Stack des Threads abgeräumt werden, in dem die Exception auftritt. Wenn du das wirklich brauchst, kann du immer noch mit <code>catch</code> das Aufräumen erzwingen, wo du es haben möchtest.</p>
<p>Das <code>terminate</code> bei <code>noexcept</code> ist überhaupt nicht dazu gedacht das Programm &quot;normal&quot; zu beenden. Es soll nur ein definiertes Verhalten schaffen, wo keine sinnvolle Fehlerbehandlung mehr möglich ist.</p>
<p>Es ist ein wenig schade, dass man <code>noexcept</code> nicht strenger gemacht hat: Eine <code>noexcept</code> -Funktion sollte nur aus <code>noexcept</code> -Statements bestehen dürfen. Der nächste logische Schritt wäre dann <code>noexcept(auto)</code> , das bei Templates und <code>inline</code> -Funktionen angewendet werden könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450998</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 20 Apr 2015 15:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 17:37:08 GMT]]></title><description><![CDATA[<blockquote>
<p>Eine <code>noexcept</code> -Funktion sollte nur aus <code>noexcept</code> -Statements bestehen dürfen.</p>
</blockquote>
<p>I.e. folgender Code</p>
<pre><code>void foo() noexcept {
    try {somethingThatThrows();}
    catch(...) {std::cerr &lt;&lt; &quot;eww.&quot;;}
}
</code></pre>
<p>Ist verboten? Gut, okay. Wir führen eine Regelung ein die es uns erlaubt beliebigen Code in einem <code>try</code> -Block unterzubringen - aber nur wenn dieser von einem <code>catch(...) { /*...*/ }</code> gefolgt wird, welcher selbst tatsächlich nur aus <code>noexcept</code> Statements besteht (wobei die obige Regel rekursiv anwendbar ist). Was ist mit</p>
<pre><code>void foo() noexcept {
    try {somethingThatThrowsInt();}
    catch(int) {std::cerr &lt;&lt; &quot;eww.&quot;;}
}
</code></pre>
<p>? Ups, <code>catch(...)</code> fehlt. Schnell ergänzen:</p>
<pre><code>void foo() noexcept try {
    try {somethingThatThrowsInt();}
    catch(int) {std::cerr &lt;&lt; &quot;eww.&quot;;}
}
catch(...) {std::terminate();}
</code></pre>
<p>Aber Moment, das letzte <code>catch(...)</code> in dieser Form können wir doch automatisch anhängen lassen? ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451012</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 20 Apr 2015 17:37:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 18:53:32 GMT]]></title><description><![CDATA[<p>Ich finde es nicht gut, wenn der Compiler Code generiert, der das Programm abschießt, wenn er das Problem auch schon beim Übersetzen hätte erkennen können. Das <code>terminate</code> -Verhalten hätte man sehr gut in der Standardbibliothek umsetzen können. Da wäre keine Compiler-Magie notwendig gewesen.</p>
<pre><code class="language-cpp">namespace std
{
	template &lt;class F, class ...Args&gt;
	auto terminate_on_exception(F &amp;&amp;f, Args &amp;&amp;...args) noexcept
	{
		try
		{
			return std::forward&lt;F&gt;(f)(std::forward&lt;Args&gt;(args)...);
		}
		catch (...)
		{
			std::terminate();
		}
	}
}

void foo() noexcept
{
	std::terminate_on_exception([]
	{
		try {somethingThatThrowsInt();}
		catch(int) {std::cerr &lt;&lt; &quot;eww.&quot;;}
	});
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2451015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451015</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 20 Apr 2015 18:53:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 23:09:40 GMT]]></title><description><![CDATA[<p>Und <code>new</code> willste auch jedes mal kapseln?</p>
<p>PS: Da solltest du eigentlich eher <code>invoke</code> anwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451025</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 20 Apr 2015 23:09:40 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 23:17:39 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>Wenn aus diesen Methoden <strong>garantiert</strong> keine Exceptions geworfen werden können (mit anderen Worten aus dem gesamten Call-Stack der jeweiligen Funktion) sehe ich persönlich keinen Grund warum Du nicht noexcept ranschreiben solltest.</p>
</blockquote>
<p>Doch, es gibt einen Grund.<br />
<code>noexcept</code> ist zumindest fraglich bei Funktionen, die Parameter &quot;by value&quot; nehmen, deren Copy-Konstruktor werfen kann (bzw. allgemein: die einen Konstruktor haben der etwas werfen könnte).</p>
<p>Aus Sicht des Standard kann die Funktion zwar trotzdem noch <code>noexcept</code> sein, aber nur weil der Aufruf der nötigen Konstruktoren für Parameter aus Sicht des Standards beim Aufrufer passiert.<br />
Und da <code>noexcept</code> für eine solche Funktion mMn. klar das principle of least astonishment verletzt, sollte man es weglassen.<br />
(Was bringt es schon dass die Funktio <code>noexcept</code> <em>ist</em>, wenn man sie <em>nicht</em> <code>noexcept</code> <em>aufrufen kann</em>?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451026</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 20 Apr 2015 23:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Mon, 20 Apr 2015 23:53:10 GMT]]></title><description><![CDATA[<p>ps: Einige Funktionen, wie z.B. auto-generierte Konstruktoren, haben ja einen automagischen <code>noexcept(&quot;true, wenns nicht gelogen ist, und sonst halt false&quot;)</code> specifier.<br />
Wäre es nicht praktisch das auch für inline-definierte Funktionen zu erlauben?<br />
Ala</p>
<pre><code class="language-cpp">inline void Fun() noexcept(auto)
{
    // Do stuff that might or might not all be noexcept(true)
}
</code></pre>
<p>EDIT: OK, gibt eh schon (lange) ein Proposal: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3207.htm" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3207.htm</a><br />
Weiss jemand was der Status davon ist?<br />
Das darin beschriebene &quot;Problem 1&quot; ist mMn. keines, wenn man es auf inline definierte Funktionen einschränkt.<br />
Und das darin beschriebene &quot;Problem 2&quot; ist glaube ich auch schon gelöst, da <code>noexcept</code> Specs laut Standard erst nach der Overload-Resolution angeguckt werden (oder hab ich da falsche Infos/etwas falsch verstanden?).</p>
<p>EDIT2: Sorry TyRoXx, hab jetzt erst gesehen dass du auch bereits <code>noexcept(auto)</code> angesprochen hattest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451027</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 20 Apr 2015 23:53:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Tue, 21 Apr 2015 15:28:24 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Und <code>new</code> willste auch jedes mal kapseln?</p>
</blockquote>
<p>Du meinst <code>make_unique</code> und <code>make_shared</code> ?<br />
&quot;Jedes mal&quot;? Es geht hier nur um <code>noexcept</code> -Funktionen.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>PS: Da solltest du eigentlich eher <code>invoke</code> anwenden.</p>
</blockquote>
<p>Stimmt, aber ich bin gedanklich noch nicht im Jahr 2017 angekommen.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p><code>noexcept</code> ist zumindest fraglich bei Funktionen, die Parameter &quot;by value&quot; nehmen, deren Copy-Konstruktor werfen kann (bzw. allgemein: die einen Konstruktor haben der etwas werfen könnte).</p>
</blockquote>
<p>Ich weiß nicht, wie praktikabel das ist, aber ein Compiler könnte da warnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451082</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 21 Apr 2015 15:28:24 GMT</pubDate></item><item><title><![CDATA[Reply to Wann noexcept nutzen? on Tue, 21 Apr 2015 16:25:06 GMT]]></title><description><![CDATA[<p>Ne Warning wäre mMn. sehr praktikabel <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="🙂"
    /><br />
Oder meinst du jetzt wie schwer/einfach das im Compiler umsetzbar ist (was ich auch nicht weiss, schätze aber das kann kein ganz grosses Problem sein)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451087</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 21 Apr 2015 16:25:06 GMT</pubDate></item></channel></rss>