<?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[constexpr &#x27;auf verdacht&#x27;]]></title><description><![CDATA[<p>Hallo,</p>
<p>ist es moeglich, eine Template-Funktion mit <code>constexpr</code> zu versehen, auch wenn innerhalb dieser Funktion eine 'normale' Funktion aufgerufen wird?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">template&lt;typename Derived&gt;
class base
{
public:
    constexpr int width()
    {
        return static_cast&lt;Derived&amp;&gt;(*this).width();
    }
};

class dynamic
{
public:
    int width()
    {
        return m_width;
    }

private:
    int m_width;
};

template&lt;int Width&gt;
class fixed
{
public:
    constexpr int width()
    {
        return Width;
    }
};

int main()
{
    base&lt;fixed&lt;4&gt;&gt; a;
    base&lt;dynamic&gt; b;

    constexpr int width_a = a.width(); // base::width ist constexpr
    int width_b = b.width(); // Wird hier das constexpr von base::width ignoriert? Kompilieren tut es jedenfalls.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/307605/constexpr-auf-verdacht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 18:01:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307605.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Aug 2012 04:53:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to constexpr &#x27;auf verdacht&#x27; on Fri, 31 Aug 2012 04:53:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ist es moeglich, eine Template-Funktion mit <code>constexpr</code> zu versehen, auch wenn innerhalb dieser Funktion eine 'normale' Funktion aufgerufen wird?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">template&lt;typename Derived&gt;
class base
{
public:
    constexpr int width()
    {
        return static_cast&lt;Derived&amp;&gt;(*this).width();
    }
};

class dynamic
{
public:
    int width()
    {
        return m_width;
    }

private:
    int m_width;
};

template&lt;int Width&gt;
class fixed
{
public:
    constexpr int width()
    {
        return Width;
    }
};

int main()
{
    base&lt;fixed&lt;4&gt;&gt; a;
    base&lt;dynamic&gt; b;

    constexpr int width_a = a.width(); // base::width ist constexpr
    int width_b = b.width(); // Wird hier das constexpr von base::width ignoriert? Kompilieren tut es jedenfalls.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2247210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247210</guid><dc:creator><![CDATA[kaos]]></dc:creator><pubDate>Fri, 31 Aug 2012 04:53:41 GMT</pubDate></item><item><title><![CDATA[Reply to constexpr &#x27;auf verdacht&#x27; on Fri, 31 Aug 2012 06:52:46 GMT]]></title><description><![CDATA[<p>kaos schrieb:</p>
<blockquote>
<p>ist es moeglich, eine Template-Funktion mit <code>constexpr</code> zu versehen, auch wenn innerhalb dieser Funktion eine 'normale' Funktion aufgerufen wird?</p>
</blockquote>
<p>constexpr bedeutet &quot;das hier liefert eine Compilezeit-Konstante, wenn es in einem Compilezeit-konstanten Kontext aufgerufen wird.&quot; Bei normalen Funktionen bedeutet das, dass eine constexpr-Funktion keine constexpr-Funktion mehr ist, wenn du ihr Argumente übergibst, die nicht constexpr sind. Aufgerufene Funktionen müssen natürlich constexpr sein, sonst ist der compilezeit-konstante Kontext nie gegeben.<br />
Bei einem Funktionstemplate kann der Compiler beim ersten pass nicht sehen, ob die aufgerufenen Funktionen constexpr sind. Bei der Instantiierung guckt er dann, ob der Kontext compilezeit-Konstant ist - könnte ja sein dass das für bestimmte Template-Argumente tatsächlich der Fall ist, wie du gezeigt hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247225</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 31 Aug 2012 06:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to constexpr &#x27;auf verdacht&#x27; on Fri, 31 Aug 2012 07:04:11 GMT]]></title><description><![CDATA[<p>Der Beispiel-Code war natuerlich falsch.<br />
Richtig:</p>
<pre><code class="language-cpp">template&lt;typename Derived&gt;
class base
{
public:
    constexpr int width()
    {
        return static_cast&lt;Derived&amp;&gt;(*this).width();
    }
};

class dynamic : public base&lt;dynamic&gt;
{
public:
    int width()
    {
        return m_width;
    }

private:
    int m_width;
};

template&lt;int Width&gt;
class fixed : public base&lt;fixed&lt;Width&gt;&gt;
{
public:
    constexpr int width()
    {
        return Width;
    }
};
</code></pre>
<blockquote>
<p>Bei der Instantiierung guckt er dann, ob der Kontext compilezeit-Konstant ist - könnte ja sein dass das für bestimmte Template-Argumente tatsächlich der Fall ist, wie du gezeigt hast.</p>
</blockquote>
<p>Heisst das, das gezeigte Beispiel is legitim?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247229</guid><dc:creator><![CDATA[kaos]]></dc:creator><pubDate>Fri, 31 Aug 2012 07:04:11 GMT</pubDate></item><item><title><![CDATA[Reply to constexpr &#x27;auf verdacht&#x27; on Fri, 31 Aug 2012 10:05:44 GMT]]></title><description><![CDATA[<p>kaos schrieb:</p>
<blockquote>
<p>static_cast&lt;Derived&amp;&gt;(*this)</p>
</blockquote>
<p>Ist niemals ein konstanter Ausdruck; this kann in einem konstanten Ausdruck nur dazu verwendet werden, um auf Member zuzugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247290</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 31 Aug 2012 10:05:44 GMT</pubDate></item></channel></rss>