<?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[Funktionszeiger als Template-Argument kein Konstanter Ausdruck?]]></title><description><![CDATA[<p>Hallo,</p>
<p>kann mir jeamnd sagen, warum der MSVC 10 folgendes als nicht konstanten Ausdruck deklariert:</p>
<pre><code class="language-cpp">template&lt;class Container,
		 typename T,
		 T (Container::*Get)()&gt;
struct st_
{
	st_() {
		static_assert(Get, &quot;foo&quot;);
	}
};

// Line 7: Excpected constant expression.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/270597/funktionszeiger-als-template-argument-kein-konstanter-ausdruck</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 01:15:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270597.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Jul 2010 07:28:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionszeiger als Template-Argument kein Konstanter Ausdruck? on Thu, 15 Jul 2010 08:21:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>kann mir jeamnd sagen, warum der MSVC 10 folgendes als nicht konstanten Ausdruck deklariert:</p>
<pre><code class="language-cpp">template&lt;class Container,
		 typename T,
		 T (Container::*Get)()&gt;
struct st_
{
	st_() {
		static_assert(Get, &quot;foo&quot;);
	}
};

// Line 7: Excpected constant expression.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1926474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926474</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Thu, 15 Jul 2010 08:21:48 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger als Template-Argument kein Konstanter Ausdruck? on Thu, 15 Jul 2010 07:47:12 GMT]]></title><description><![CDATA[<p>weil Get keine Constant-Expression ist. Hier ein Auszug aus der Doku:</p>
<blockquote>
<p>An integral constant expression that can be converted to a Boolean.</p>
<p>If the evaluated expression is zero (false), the string-literal parameter is displayed and the compilation fails with an error. If the expression is nonzero (true), the static_assert declaration has no effect.</p>
</blockquote>
<p>Probier mal:</p>
<pre><code class="language-cpp">template&lt;class Container, typename T, T (Container::*Get)()&gt;
struct st_
{
    st_() 
    {
        static_assert(Get != 0, &quot;Template argument must be non null&quot;);
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1926480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926480</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 15 Jul 2010 07:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger als Template-Argument kein Konstanter Ausdruck? on Thu, 15 Jul 2010 08:26:26 GMT]]></title><description><![CDATA[<p>ogni42 schrieb:</p>
<blockquote>
<p>weil Get keine Constant-Expression ist.</p>
</blockquote>
<p>Da der Typ bool immer dan true ist, wenn der Wert != 0 ist (und nichts anderes) ist &quot;Get&quot; und &quot;Get != 0&quot; äquivalent zueinander.</p>
<p>Dennoch habe ich es getestet: Leider funktioniert es nicht. Zur Kompilierzeit msus aber bekannt sein, ob NULL übergeben wurde oder nicht.<br />
Ist dies evtl. ein Fehler in der Umsetzung von static_assert im VS10 oder so gewollt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926500</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Thu, 15 Jul 2010 08:26:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger als Template-Argument kein Konstanter Ausdruck? on Thu, 15 Jul 2010 08:43:51 GMT]]></title><description><![CDATA[<p>Also zumindest beim gcc darf man sowieso nicht NULL übergeben.</p>
<p>Angenommen der Sinn dieses Konstrukts ist, dass der Compiler die Dereferenzierung von Get wegoptimieren und den Aufruf ggfs. sogar inlinen kann, kann ich mir nur schwer vorstellen dass der Standard NULL hier zulässt. Wäre das nicht der Fall, könnte man den Methodenzeiger auch als normalen Parameter übernehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926506</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 15 Jul 2010 08:43:51 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger als Template-Argument kein Konstanter Ausdruck? on Thu, 15 Jul 2010 08:50:51 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>dass der Compiler die Dereferenzierung von Get wegoptimieren und den Aufruf ggfs. sogar inlinen kann</p>
</blockquote>
<p>Das ist der Sinn dieses Arguments, in der Tat <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="😉"
    /><br />
Prinzipiell müsste der Compiler dabei jedoch in der Tat den Dienst verweigern. Das tut der MSVC 10 auch, jedoch mit der Meldung dass keine 3 Argumente erwartet wurden ... irgendwie falsch würde ich sagen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926508</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Thu, 15 Jul 2010 08:50:51 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger als Template-Argument kein Konstanter Ausdruck? on Thu, 15 Jul 2010 11:53:52 GMT]]></title><description><![CDATA[<p>Ich hätte jetzt darauf getippt, daß Funktionszeiger gar nicht NULL sein können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926636</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 15 Jul 2010 11:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger als Template-Argument kein Konstanter Ausdruck? on Thu, 15 Jul 2010 11:59:49 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Ich hätte jetzt darauf getippt, daß Funktionszeiger gar nicht NULL sein können.</p>
</blockquote>
<p>Ich denke ich verstehe dich nur falsch. Natürlich können Funktionszeiger NULL sein:</p>
<pre><code class="language-cpp">void (*func)() = NULL;     // absolut in Ordnung
</code></pre>
<p>Wie sonst sollte man Callbacks/Events in Klassen realisieren. Irgendeinen Initialisierungswert müssen sie ja haben.</p>
<p>Es ist nur fraglich, ob ein Funktionszeiger als Template-Argument NULL sein darf. Prinzipiell ist auch das in Ordnung. Zur Laufzeit müsste es jedoch eine Exception geben. Natürlich würde es Sinn machen, dass der Compiler den Quark gleich erkennt ... VS tut das wie gesagt, aber mit einer irreführenden Fehlermeldung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926642</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Thu, 15 Jul 2010 11:59:49 GMT</pubDate></item></channel></rss>