<?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[decltype mit template-member variable]]></title><description><![CDATA[<p>Hallo,</p>
<p>wieso geht der folgende Code nicht:</p>
<pre><code>template &lt;class T&gt; struct foo
{
	T container;
	decltype(*std::begin(container)) container_content; // Das geht nicht
};

int _tmain(int argc, _TCHAR* argv[])
{
	foo&lt;std::vector&lt;int&gt;&gt; f;
}
</code></pre>
<p>Ich erhalte hier die Fehlermeldung: &quot;error C2784: &quot;_Ty *std::begin(_Ty (&amp;)[_Size])&quot;: template-Argument für &quot;_Ty (&amp;)[_Size]&quot; konnte nicht von &quot;unknown&quot; hergeleitet werden.&quot;</p>
<p>Wieso &quot;unknown&quot;? Der Typ von &quot;container&quot; muss doch an der Stelle des <code>decltype</code> schon bekannt sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326262/decltype-mit-template-member-variable</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 06:20:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326262.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Jun 2014 18:00:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to decltype mit template-member variable on Mon, 09 Jun 2014 18:01:27 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wieso geht der folgende Code nicht:</p>
<pre><code>template &lt;class T&gt; struct foo
{
	T container;
	decltype(*std::begin(container)) container_content; // Das geht nicht
};

int _tmain(int argc, _TCHAR* argv[])
{
	foo&lt;std::vector&lt;int&gt;&gt; f;
}
</code></pre>
<p>Ich erhalte hier die Fehlermeldung: &quot;error C2784: &quot;_Ty *std::begin(_Ty (&amp;)[_Size])&quot;: template-Argument für &quot;_Ty (&amp;)[_Size]&quot; konnte nicht von &quot;unknown&quot; hergeleitet werden.&quot;</p>
<p>Wieso &quot;unknown&quot;? Der Typ von &quot;container&quot; muss doch an der Stelle des <code>decltype</code> schon bekannt sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403152</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 09 Jun 2014 18:01:27 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Mon, 09 Jun 2014 18:04:23 GMT]]></title><description><![CDATA[<p>Muss ein Bug in Visual Studio sein, das sollte funktionieren, abgesehen davon, dass du wohl keine Referenz als Member haben möchtest:</p>
<pre><code class="language-cpp">typename std::decay&lt;decltype(*std::begin(container))&gt;::type
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2403154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403154</guid><dc:creator><![CDATA[msvcbug]]></dc:creator><pubDate>Mon, 09 Jun 2014 18:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Mon, 09 Jun 2014 18:08:44 GMT]]></title><description><![CDATA[<p>msvcbug schrieb:</p>
<blockquote>
<p>Muss ein Bug in Visual Studio sein, das sollte funktionieren,</p>
</blockquote>
<p>Na toll, das ist nervig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>msvcbug schrieb:</p>
<blockquote>
<p>abgesehen davon, dass du wohl keine Referenz als Member haben möchtest:</p>
<pre><code class="language-cpp">typename std::decay&lt;decltype(*std::begin(container))&gt;::type
</code></pre>
</blockquote>
<p>Geht leider auch nicht, gleicher Fehler. Irgendwelche Alternativen verfügbar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403158</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 09 Jun 2014 18:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Mon, 09 Jun 2014 18:30:45 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typename std::decay&lt;decltype(*std::begin(std::declval&lt;T&gt;()))&gt;::type
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2403161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403161</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 09 Jun 2014 18:30:45 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Mon, 09 Jun 2014 20:19:23 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typename std::decay&lt;decltype(*std::begin(std::declval&lt;T&gt;()))&gt;::type
</code></pre>
</blockquote>
<p>Das klappt schonmal, danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Allerdings würde ich gerne <code>const</code> -qualifizierer behalten und diese werden ja durch <code>std::decay</code> entfernt... gibts da sowas ähnliches wie <code>std::decay</code> , welches <code>const</code> erhät oder muss ich mir das mittels <code>is_const</code> selbst zusammen basteln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403173</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 09 Jun 2014 20:19:23 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Mon, 09 Jun 2014 20:32:03 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Allerdings würde ich gerne <code>const</code> -qualifizierer behalten</p>
</blockquote>
<p>Warum?</p>
<p>In dem Fall schreib' einfach</p>
<pre><code>typename std::remove_reference&lt;decltype(*std::begin(std::declval&lt;T&gt;()))&gt;::type
</code></pre>
<p>(Oder seit C++1Y</p>
<pre><code>std::remove_reference_t&lt;decltype(*std::begin(std::declval&lt;T&gt;()))&gt;
</code></pre>
<p>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403175</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 09 Jun 2014 20:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Tue, 10 Jun 2014 09:14:28 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>In dem Fall schreib' einfach</p>
<pre><code>typename std::remove_reference&lt;decltype(*std::begin(std::declval&lt;T&gt;()))&gt;::type
</code></pre>
</blockquote>
<p>Hm, das geht komischerweise nicht, ich bekomme hier die Fehlermeldung <em>&quot;error C2512: 'foo&lt;std::vector&lt;int,std::allocator&lt;_Ty&gt;&gt;&gt;': Kein geeigneter Standardkonstruktor verfügbar&quot;</em>. Auch ein Bug? Mit <code>std::decay</code> funktionierts auf jeden Fall...</p>
<p>Aber ich hab hier auch gleich noch ein paar neue Fragen. Dieser Code:</p>
<pre><code>template &lt;class T&gt; struct foo
{
	void bar()
	{
		decltype(*(container.begin())) val;
	}
	T container;
};

int _tmain(int argc, _TCHAR* argv[])
{
	foo&lt;std::vector&lt;int&gt;&gt; f;
	f.bar();
}
</code></pre>
<ul>
<li>Wieso kann ich hier das <code>decltype</code> über die Deklaration von <code>container</code> schreiben, bei meinem vorherigen Beispiel ging das nicht.</li>
<li>Wieso muss ich überhaupt das <code>decltype</code> unterhalb der Deklaration eines Members schreiben auf den dieses sich bezieht? Innerhalb einer Klasse kann ich doch sonst auch von überall auf alle Member zugreifen ohne dass ich darauf achten muss wo diese deklariert sind?</li>
<li>Wieso bekomme ich bei diesem Beispiel einen Compile Fehler <em>&quot;error C2530: 'val': Verweise müssen initialisiert werden&quot;</em>? Ich hab hier doch gar keine Verweise? <code>container</code> ist vom Typ <code>std::vector&lt;int&gt;</code> , daher müsste <code>*(container.begin())</code> doch auch vom Typ <code>int</code> sein und nicht <code>int&amp;</code> oder?</li>
</ul>
<p>Diese Logik kann ich momentan nicht nachvollziehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403235</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 10 Jun 2014 09:14:28 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Tue, 10 Jun 2014 09:56:10 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Wieso kann ich hier das <code>decltype</code> über die Deklaration von <code>container</code> schreiben, bei meinem vorherigen Beispiel ging das nicht.</p>
</blockquote>
<p>Weil du dich dort innerhalb einer Funktionsdefinition befindest.</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>Wieso muss ich überhaupt das <code>decltype</code> unterhalb der Deklaration eines Members schreiben auf den dieses sich bezieht? Innerhalb einer Klasse kann ich doch sonst auch von überall auf alle Member zugreifen ohne dass ich darauf achten muss wo diese deklariert sind?</p>
</blockquote>
<p>Eine Klasse gilt als vollständig definiert innerhalb des Funktionskörpers von Memberfunktionen, in Defaultargumenten, Exceptionspezifikationen und Memberinitialisierern. An diesen Stellen können also auch Member verwendet werden, die lexikalisch erst später deklariert werden. Ansonsten gilt wie üblich, dass Namen erst nach ihrer Deklaration verwendet werden können.</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>Wieso bekomme ich bei diesem Beispiel einen Compile Fehler <em>&quot;error C2530: 'val': Verweise müssen initialisiert werden&quot;</em>? Ich hab hier doch gar keine Verweise? <code>container</code> ist vom Typ <code>std::vector&lt;int&gt;</code> , daher müsste <code>*(container.begin())</code> doch auch vom Typ <code>int</code> sein und nicht <code>int&amp;</code> oder?</p>
</blockquote>
<p>Der Ausdruck *(container.begin()) hat den Typ int und ist ein lvalue (du könntest z.B. *(container.begin())=0 schreiben). decltype liefert eine Referenz, wenn der Ausdruck, auf dass es angwandt wird, ein lvalue ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403254</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 10 Jun 2014 09:56:10 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Tue, 10 Jun 2014 10:32:50 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank, das erklärt einiges <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Allerdings</p>
<p>camper schrieb:</p>
<blockquote>
<p>Der Ausdruck *(container.begin()) hat den Typ int und ist ein lvalue (du könntest z.B. *(container.begin())=0 schreiben). decltype liefert eine Referenz, wenn der Ausdruck, auf dass es angwandt wird, ein lvalue ist.</p>
</blockquote>
<p>funktioniert bei mir keine dieser Möglichkeiten:</p>
<pre><code>decltype(*(container.begin()) = 0) val; // error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'int' akzeptiert
decltype(*(container.begin() = 0)) val; // error C2530: 'val': Verweise müssen initialisiert werden
decltype(*(container.begin())) val = 0; // error C2440: 'Initialisierung': 'int' kann nicht in 'int &amp;' konvertiert werden
</code></pre>
<p>Ist das jetzt auch wieder auf Bugs zurückzuführen? Weil wenn ja dann glaub ich verzichte ich in Zukunft auf <code>decltype</code> ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403261</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 10 Jun 2014 10:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Tue, 10 Jun 2014 15:47:59 GMT]]></title><description><![CDATA[<blockquote>
<p>Ist das jetzt auch wieder auf Bugs zurückzuführen?</p>
</blockquote>
<pre><code>decltype(*(container.begin()) = 0) val;
</code></pre>
<p>Richtig, falls der Elementtyp des Containers eine derartige Zuweisung zulässt.</p>
<pre><code>decltype(*(container.begin() = 0)) val;
</code></pre>
<p>Das ist Unsinn und kompiliert zu Recht nicht - selbst wenn der Iteratortyp des Containers ein Zeiger ist. Du kannst einem rvalue nichts zuweisen.</p>
<pre><code>decltype(*(container.begin())) val = 0;
</code></pre>
<p>Ebenfalls Unsinn <strong>außer</strong> <code>container</code> ist als <code>const</code> deklariert (bzw. <code>T</code> ist <code>const</code> ) - in dem Fall gibt begin einen <code>const_iterator</code> zurück. Das Dereferenzieren gibt eine Const-Referenz, die du mit einem rvalue initialisieren kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403332</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 10 Jun 2014 15:47:59 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 09:50:18 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Ist das jetzt auch wieder auf Bugs zurückzuführen?</p>
</blockquote>
<pre><code>decltype(*(container.begin()) = 0) val;
</code></pre>
<p>Richtig, falls der Elementtyp des Containers eine derartige Zuweisung zulässt.</p>
</blockquote>
<p>Damn, da hab ich grade das Feature gelernt und für cool befunden und kanns schon nicht mehr benutzen. <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>
<p>Arcoth schrieb:</p>
<blockquote>
<pre><code>decltype(*(container.begin() = 0)) val;
</code></pre>
<p>Das ist Unsinn und kompiliert zu Recht nicht - selbst wenn der Iteratortyp des Containers ein Zeiger ist. Du kannst einem rvalue nichts zuweisen.</p>
</blockquote>
<p>Schon, aber die Fehlermeldung dazu ist doch Quatsch, oder? Aber ist auch egal, hängt vermutlich auch mit dem obigen Bug zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403430</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 11 Jun 2014 09:50:18 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 10:56:09 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Schon, aber die Fehlermeldung dazu ist doch Quatsch, oder? Aber ist auch egal, hängt vermutlich auch mit dem obigen Bug zusammen.</p>
</blockquote>
<p>Also Quatsch kann man das denke ich nicht nennen.</p>
<p>Das einzige was fehlt, wäre der Hinweis dass <code>'int'</code> hier eben keine Lvalue ist, und daher nicht nach <code>'int&amp;'</code> konvertiert werden kann.<br />
Davon abgesehen... ist halt knapp gehalten, aber &quot;'Initialisierung': XXX&quot; ist doch irgendwie klar: es geht um eine Initialisierung (nämlich die von <code>'val'</code> ), und die funktioniert nicht weil XXX.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403434</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jun 2014 10:56:09 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 10:55:41 GMT]]></title><description><![CDATA[<blockquote>
<p>Das einzige was fehlt, wäre der Hinweis dass 'int' hier eben keine Lvalue ist, und daher nicht nach 'int&amp;' konvertiert werden kann.</p>
</blockquote>
<p>Du redest von der falschen Fehlermeldung. Uns geht es um die Zuweisung des <strong>Iterators</strong>, nicht eines Elementtyps.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403436</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 11 Jun 2014 10:55:41 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 11:20:16 GMT]]></title><description><![CDATA[<p>*facepalm* Ja, falsche Zeile geguckt. Sorry <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="🙂"
    /></p>
<p>Also diese da, right?</p>
<pre><code class="language-cpp">decltype(*(container.begin() = 0)) val; // error C2530: 'val': Verweise müssen initialisiert werden
</code></pre>
<p><s>Ich vermute mal dass hier das nonstandard Verhalten von MSVC zuschlägt (*), und die Zuweisung des Iterators noch funktioniert (obwohl sie nicht sollte).</s><br />
Dann zerfällt das was übrig bleibt zu</p>
<pre><code class="language-cpp">T&amp; val; // error C2530: 'val': Verweise müssen initialisiert werden
// Englisch: error C2530: 'val' : references must be initialized
</code></pre>
<p>...und auf einmal macht die Fehlermeldung auch wieder Sinn.</p>
<p>*:<br />
MSVC 2005 (2012/2013 hab ich grad nicht zur Hand) compiliert sowas ohne zu murren:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; vec;
	vec.begin() = vec.end(); // Ja, nur ein &quot;=&quot;!
</code></pre>
<p>EDIT: MSVC hast dieses nonstandard Verhalten zwar, spielt hier aber keine Rolle, weil es um UDTs geht. Und die Zuweisung von UDTs ist der Aufruf von <code>operator =</code> , und der Aufruf von Memberfunktionen auf Rvalues ist erlaubt.<br />
(OK, der Iterator könnte ein einfacher Zeiger sein, aber er muss nicht. Und wenn er nicht ist, ist er ein UDT, und es sollte das gelten was ich geschrieben habe. Wenn ich mich nicht schon wieder irre. Ach, C++ ist zu kompliziert ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403441</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jun 2014 11:20:16 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 11:15:52 GMT]]></title><description><![CDATA[<p>Es wird ja keine Rvalue zugewiesen.<br />
Es wird ne Memberfunktion (nämlich <code>operator =</code> ) aufgerufen.<br />
Und das darf man mit Rvalues:</p>
<p><a href="http://ideone.com/Bhzyma" rel="nofollow">http://ideone.com/Bhzyma</a></p>
<p>Was natürlich beknackt ist, aber ist halt so.<br />
Oder täuscht mich jetzt meine Erinnerung, und GCC hat zufällig gleichzeitig nen Bug der das erlaubt? Würde mich schon wundern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403444</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jun 2014 11:15:52 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 11:38:39 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>:</p>
<blockquote>
<p>Oder täuscht mich jetzt meine Erinnerung, und GCC hat zufällig gleichzeitig nen Bug der das erlaubt?</p>
</blockquote>
<p>Nein, das ist schon richtig so - ich habe mich etwas irreführend ausgedrückt. Für die eingebauten Operatoren (welche für Zeiger aufgerufen werden) gilt, dass sie nur lvalues nehmen.<br />
Aber wenn der Iterator kein Zeiger ist, dann sollte eine Zuweisung à la <code>= 0</code> auch gar nicht funktionieren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Ist Schwachsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403449</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 11 Jun 2014 11:38:39 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 12:29:45 GMT]]></title><description><![CDATA[<p>Hmmmmmmm...<br />
Da hast du jetzt wieder Recht.<br />
Bei</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; vec;
		vec.begin() = 0;
</code></pre>
<p>bekomme ich mit MSVC 2005<br />
<code>error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)</code></p>
<p>Ich vermute also dass er wirklich die Zuweisung akzeptiert - warum auch immer.</p>
<p>Müsste ich mit MSVC 2013 nochmal probieren. Vielleicht einfach mit dem Debugger reinsteppen falls er es compiliert, dann hätte man zumindest die Funktion schnell gefunden die er da nimmt.</p>
<p>ps: Dass es Schwachsinn ist ist eh klar -- egal ob und warum es funktioniert. Ich frag mich nur wie die Fehlermeldung zustande kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403462</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jun 2014 12:29:45 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 12:54:30 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich frag mich nur wie die Fehlermeldung zustande kommt.</p>
</blockquote>
<p>Naja: Er deklariert den Member als eine Referenz und sieht dann dass in einem Konstruktor die Referenz uninitialisiert bleibt. (Der Default-Konstruktor wird bei einem Referenz-Member ohne Initializer automatisch als <code>deleted</code> definiert).</p>
<p>Die entscheidende Frage ist mit welchem Typ er die Referenz deklariert.</p>
<p>Ich hätte gesagt, einem Iterator der ein Klassenobjekt ist kann man schlecht <code>0</code> zuweisen, daher wird bei MSVC der Iterator ein Zeiger sein. Also erlaubt er wohl bei Zeigern diese Zuweisung (welche natürlich nicht standardkonform ist).</p>
<p>Das wäre die intuitive Erklärung, nur leider ist sie offenbar falsch:</p>
<blockquote>
<p>error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)</p>
</blockquote>
<p>Oder hat MSVC mittlerweile einen Zeiger d'raus gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403467</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 11 Jun 2014 12:54:30 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 13:08:06 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Ich frag mich nur wie die Fehlermeldung zustande kommt.</p>
</blockquote>
<p>Naja: Er deklariert den Member als eine Referenz und sieht dann dass in einem Konstruktor die Referenz uninitialisiert bleibt. (Der Default-Konstruktor wird bei einem Referenz-Member ohne Initializer automatisch als <code>deleted</code> definiert).</p>
</blockquote>
<p>DER Teil ist mir klar, aber das kann ja nur der Grund sein wenn der Compiler die Zuweisung erstmal gefressen hat.<br />
Und ich frag' mich eben warum er die frisst.</p>
<blockquote>
<p>Ich hätte gesagt, einem Iterator der ein Klassenobjekt ist kann man schlecht <code>0</code> zuweisen, daher wird bei MSVC der Iterator ein Zeiger sein. Also erlaubt er wohl bei Zeigern diese Zuweisung (welche natürlich nicht standardkonform ist).</p>
</blockquote>
<p>Nö, bei Zeigern erlaubt er es nicht.<br />
<code>error C2106: '=' : left operand must be l-value</code><br />
MSVC erlaubt nur (fälschlicherweise) Rvalues an Lvalue Referenzen zu binden. Bzw. weiss ich nicht ob das in 2012/2013 immer noch so ist, bis 2008 war es sicher so.</p>
<p>Naja, ich hab Studio 2012 und 2013 zu Hause installiert, da kann ich das mal ausprobieren.</p>
<p>ps: MSVC hat per Default auch &quot;checked iterators&quot;, also keine Zeiger als Vektor-Iteratoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403469</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jun 2014 13:08:06 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Wed, 11 Jun 2014 23:47:44 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30076">@happystudent</a></p>
<p>happystudent schrieb:</p>
<blockquote>
<pre><code class="language-cpp">decltype(*(container.begin()) = 0) val; // error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'int' akzeptiert 
decltype(*(container.begin() = 0)) val; // error C2530: 'val': Verweise müssen initialisiert werden 
decltype(*(container.begin())) val = 0; // error C2440: 'Initialisierung': 'int' kann nicht in 'int &amp;' konvertiert werden
</code></pre>
</blockquote>
<p>Ich glaube du hast einfach die Fehlermeldungen von Zeile 1 und 2 vertauscht. Ich bekomme mit MSVC 2013 folgendes:</p>
<pre><code class="language-cpp">decltype(*(container.begin()) = 0) val; // error C2530: 'val' : references must be initialized
		decltype(*(container.begin() = 0)) val2; // error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
		decltype(*(container.begin())) val3 = 0; // error C2440: 'initializing' : cannot convert from 'int' to 'int &amp;'
</code></pre>
<p>1: Iterator holen und dereferenzieren, und auf die so erhaltene Referenz ne Zuweisung =&gt; Ergebnistyp der Zuweisung ist ne Referenz, und die müssen initialisiert werden. Fehlermeldung korrekt.</p>
<p>2: Iterator holen und nen Nuller-Literal zuweisen. Ginge nur wenn der Iterator ein Zeiger wäre, was er nicht sein muss, und in diesem Fall eben auch nicht ist. Fehlermeldung korrekt.<br />
(OK, es ginge auch wenn die Iterator Implementierung eine nicht vorgeschriebene aber vermutlich auch nicht verbotene Extension hätte, die das erlaubt. Wobei ich nicht wüsste wozu das gut sein sollte.)</p>
<p>3: Iterator holen und dereferenzieren. Typ ist ne Lvalue-Referenz, und an die kann man keinen Literal (Rvalue) binden. Fehlermeldung korrekt.</p>
<p>Übersehe ich was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403533</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jun 2014 23:47:44 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Thu, 12 Jun 2014 00:09:51 GMT]]></title><description><![CDATA[<p>BTW: Die non-Standard &quot;non-const Lvalue-Referenzen an Rvalues binden&quot; &quot;Extension&quot; hat MSVC übrigens immer noch:</p>
<pre><code class="language-cpp">std::string make_string() { return &quot;foo&quot;; }
void mutate_string(std::string&amp; str) { str = &quot;bar&quot;; }

int main()
{
	mutate_string(make_string());
}
</code></pre>
<p><code>Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped</code></p>
<p>Lässt sich (wie auch schon relativ lange) durch den Switch <code>/Za</code> abschalten. Damit bekommt man dann</p>
<pre><code>1&gt;filename.cpp(123): error C2664: 'void mutate_string(std::string &amp;)' : cannot convert argument 1 from 'std::string' to 'std::string &amp;'
1&gt;          A non-const reference may only be bound to an lvalue
</code></pre>
<p>Nur dann kann man <code>windows.h</code> nimmer includen, weil es lauter <code>error C2467: illegal declaration of anonymous 'struct'</code> und <code>'Identifier' : unknown size</code> Fehler hagelt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /><br />
Mir ist schon klar dass diese Nonstandard-Sachen aus den Windows-Headers nicht so einfach zu entfernen sind, weil da Dinge dabei sind wo der verwendende Code umgeschrieben werden müsste wenn man sie standardkonform macht.<br />
Aber man könnte statt dessen ja das machen was das das MinGW Team gemacht hat: die Extensions lokal für die paar Stellen wo sie benötige werden erlauben, unabhängig vom <code>/Za</code> Switch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403537</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 12 Jun 2014 00:09:51 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Thu, 12 Jun 2014 08:51:06 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30076">@happystudent</a><br />
Ich glaube du hast einfach die Fehlermeldungen von Zeile 1 und 2 vertauscht. Ich bekomme mit MSVC 2013 folgendes:</p>
</blockquote>
<p>Ups, habs grade ausprobiert und du hast recht. Das ist natürlich peinlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Dann nehme ich alles zurück was die Fehlermeldungen angeht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403560</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Thu, 12 Jun 2014 08:51:06 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Thu, 12 Jun 2014 10:40:19 GMT]]></title><description><![CDATA[<blockquote>
<p>BTW: Die non-Standard &quot;non-const Lvalue-Referenzen an Rvalues binden&quot; &quot;Extension&quot; hat MSVC übrigens immer noch:</p>
</blockquote>
<p>Ist das nicht eine enorme Fehlerquelle? Ich meine, wenn ich eine non-const lvalue-Referenz als Parameter deklariere, erwarte ich eine Referenz auf ein Objekt das eine größere Lebenszeit hat als nur den Funktionsrumpf. Bei Const-Referenzen ist die mentality anders.</p>
<blockquote>
<p>Ich glaube du hast einfach die Fehlermeldungen von Zeile 1 und 2 vertauscht.</p>
</blockquote>
<p>Das erklärt alles. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403580</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 12 Jun 2014 10:40:19 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Thu, 12 Jun 2014 11:28:41 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>BTW: Die non-Standard &quot;non-const Lvalue-Referenzen an Rvalues binden&quot; &quot;Extension&quot; hat MSVC übrigens immer noch:</p>
</blockquote>
<p>Ist das nicht eine enorme Fehlerquelle? Ich meine, wenn ich eine non-const lvalue-Referenz als Parameter deklariere, erwarte ich eine Referenz auf ein Objekt das eine größere Lebenszeit hat als nur den Funktionsrumpf. Bei Const-Referenzen ist die mentality anders.</p>
</blockquote>
<p>Jain. So schlimm ist es dann doch nicht. Vor C++11 war es durchaus auch mal nützlich.<br />
Oder fällt dir auf die Schnelle ein Beispiel ein wo man sich damit wirklich unabsichtlich ins Knie schiessen kann?</p>
<p>MS schleppt das halt schon seit Ewigkeiten mit rum, und da es dadurch vermutlich viel Code gibt der ohne die Extension nicht baut, traun sie sich da nicht drüber.</p>
<p>Wobei es ja genügend andere Möglichkeiten gäbe. z.B. könnte man für diese Extension einen eigenen Switch machen, dass man die einzeln aus oder einschalten kann.</p>
<p>Und wie erwähnt - ein SDK mit Header Files die sich auch bei ausgeschaltenen Extensions includen lassen wäre auch mal fein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403587</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 12 Jun 2014 11:28:41 GMT</pubDate></item><item><title><![CDATA[Reply to decltype mit template-member variable on Thu, 12 Jun 2014 11:34:25 GMT]]></title><description><![CDATA[<p>Zudem gibts bei Level 4 eine entsprechende Compilerwarnung. Wenn es einem wichtig ist, passiert das also nicht &quot;aus Versehen&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403590</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 12 Jun 2014 11:34:25 GMT</pubDate></item></channel></rss>