<?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[std::tr1::array in Initialisierungliste initialisieren]]></title><description><![CDATA[<p>Hallo,<br />
gibt es eine Möglichkeit ein std::tr1::array in der Initialisierungsliste von einer Klasse zu initialisieren? Der Konstruktor hat das ja anscheinend nicht drauf.<br />
Braucht man dafür C++0x oder bietet C++0x eine Möglichkeit sowas selber zu schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285553/std-tr1-array-in-initialisierungliste-initialisieren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 06:53:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285553.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Apr 2011 21:37:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Fri, 22 Apr 2011 21:37:51 GMT]]></title><description><![CDATA[<p>Hallo,<br />
gibt es eine Möglichkeit ein std::tr1::array in der Initialisierungsliste von einer Klasse zu initialisieren? Der Konstruktor hat das ja anscheinend nicht drauf.<br />
Braucht man dafür C++0x oder bietet C++0x eine Möglichkeit sowas selber zu schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053094</guid><dc:creator><![CDATA[Array]]></dc:creator><pubDate>Fri, 22 Apr 2011 21:37:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 00:15:15 GMT]]></title><description><![CDATA[<p>Das einzige, was du mit C++ in der Konstruktorinitialisierungsliste tun erstellen kannst, ist eine Kopie, folglich musst du irgenwie ein Original erstellen, z.B. so:</p>
<pre><code class="language-cpp">typedef std::tr1::array&lt;int, 3&gt; my_array;
my_array make_array(int a, int b, int c)
{
    my_array a = { a, b, c };
    return a;
}

struct foo
{
    my_array arr;
    foo(int a, int b, int c) : arr( make_array( a, b, c ) ) {}
...
</code></pre>
<p>Dank Copyelision sollte ein brauchbarer Compiler hierbei keine unnötigen Kopien erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053119</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 23 Apr 2011 00:15:15 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 04:54:33 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Das einzige, was du mit C++ in der Konstruktorinitialisierungsliste tun erstellen kannst, ist eine Kopie, folglich musst du irgenwie ein Original erstellen, z.B. so:</p>
<pre><code class="language-cpp">typedef std::tr1::array&lt;int, 3&gt; my_array;
my_array make_array(int a, int b, int c)
{
    my_array a = { a, b, c };
    return a;
}

struct foo
{
    my_array arr;
    foo(int a, int b, int c) : arr( make_array( a, b, c ) ) {}
...
</code></pre>
<p>Dank Copyelision sollte ein brauchbarer Compiler hierbei keine unnötigen Kopien erstellen.</p>
</blockquote>
<p>Und wie macht man das bei 20 Elementen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2053126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053126</guid><dc:creator><![CDATA[hehehe]]></dc:creator><pubDate>Sat, 23 Apr 2011 04:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 06:19:49 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Dank Copyelision sollte ein brauchbarer Compiler hierbei keine unnötigen Kopien erstellen.</p>
</blockquote>
<p>Move semantics würde das auch manuell machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053128</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sat, 23 Apr 2011 06:19:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 06:25:19 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Move semantics würde das auch manuell machen.</p>
</blockquote>
<p>move ist ja C++0x, da kann man aber das array direkt in der Initialislierungsliste füllen, ohne Umweg über Copy-Konstruktor.</p>
<p>hehehe schrieb:</p>
<blockquote>
<p>Und wie macht man das bei 20 Elementen. <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>
</blockquote>
<p>Das schaut nicht anders aus. Aber ob du die 20 Werte direkt in ne Initialisierungsliste schreibst oder als Parameter in ne Funktion packst ist doch wurscht, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053130</guid><dc:creator><![CDATA[Sensai_]]></dc:creator><pubDate>Sat, 23 Apr 2011 06:25:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 07:21:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;utility&gt;
#include &lt;array&gt;

template&lt;class Iter&gt;
inline void assign_helper(Iter) {}

template&lt;class Iter, class U, class...More&gt;
inline void assign_helper(Iter it, U&amp;&amp; u, More&amp;&amp;...more)
{
  *it = std::forward&lt;U&gt;(u);
  ++it;
  assign_helper(it,std::forward&lt;More&gt;(more)...);
}

template&lt;class T&gt;
std::array&lt;T,0&gt; make_array() { return std::array&lt;T,0&gt;(); }

template&lt;class T, class U, class...Args&gt;
std::array&lt;T,1+sizeof...(Args)&gt;
make_array(U&amp;&amp; u, Args&amp;&amp;...args)
{
  std::array&lt;T,1+sizeof...(Args)&gt; result;
  assign_helper(&amp;result[0],std::forward&lt;U&gt;(u),std::forward&lt;Args&gt;(args)...);
  return result;
}

int main()
{
  using namespace std;
  auto a = make_array&lt;long&gt;(1,2,3,5,8,13,21,34);
  int s = a.size();
  cout &lt;&lt; &quot;---&quot; &lt;&lt; endl;
  for (int i=0; i&lt;s; ++i) {
    cout &lt;&lt; a[i] &lt;&lt; '\n';
  }
  cout &lt;&lt; &quot;---&quot; &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2053146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053146</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 23 Apr 2011 07:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 13:29:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>: schön nur irgendwie überflüssig. Die Frage stellt sich mit C++0x ja gar nicht erst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053269</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 23 Apr 2011 13:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 14:20:19 GMT]]></title><description><![CDATA[<p>Danke für eure Anworten.<br />
Die Antwort von krümelkacker bietet zwar alles, ist aber recht kompiliziert <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 />
Wie kann man mit std::move denn ein Array direkt in der Initialisierungsliste füllen?<br />
Ich hab mir jetzt eine kleine Hilfsfunktion geschrieben, umd ein Array mit einem Wert zu initialisieren:</p>
<pre><code class="language-cpp">template&lt;typename T, size_t size&gt;
std::array&lt;T, size&gt;&amp;&amp; make_array(T&amp;&amp; t) {
	std::array&lt;T, size&gt; temp = {t};
	return std::move(temp);
};
</code></pre>
<p>Jedoch wird hierbei nur das erste Element mit dem Wert t initialisiert. Alle anderen Elemente werden 0. Wie krieg ich das noch hin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053291</guid><dc:creator><![CDATA[Array]]></dc:creator><pubDate>Sat, 23 Apr 2011 14:20:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 20:52:41 GMT]]></title><description><![CDATA[<p>Array schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;typename T, size_t size&gt;
std::array&lt;T, size&gt;&amp;&amp; make_array(T&amp;&amp; t) {
	std::array&lt;T, size&gt; temp = {t};
	return std::move(temp);
};
</code></pre>
<p>Jedoch wird hierbei nur das erste Element mit dem Wert t initialisiert. Alle anderen Elemente werden 0. Wie krieg ich das noch hin?</p>
</blockquote>
<p>1. Deine Verwendung von &amp;&amp; und std::move ist falsch. Wie kommst Du darauf, der Funktion einen solchen Rückgabetypen zu verpassen? Das interessiert mich mal wirklich. Es gibt nämlich viele, die das falsch machen.</p>
<p>2. Siehe camper's Beitrag. Ich habe es jetzt nicht extra nachgeguckt, aber nach dem Klang seiner Antwort scheint ein array&lt;&gt;-Objekt sich in C++0x auch im Rahmen der Initialisierungsliste eines Konstruktors ohne weiteres mit Inhalt füllen zu lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053388</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 23 Apr 2011 20:52:41 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 21:06:03 GMT]]></title><description><![CDATA[<p>[quote=&quot;EOutOfResources&quot;]Move semantics würde das auch manuell machen./quote]<br />
Das habe ich versucht.</p>
<p>Sensai_ schrieb:</p>
<blockquote>
<p>move ist ja C++0x, da kann man aber das array direkt in der Initialislierungsliste füllen, ohne Umweg über Copy-Konstruktor.</p>
</blockquote>
<p>Da habe ich bisher noch nichts zu gefunden.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>1. Deine Verwendung von &amp;&amp; und std::move ist falsch. Wie kommst Du darauf, der Funktion einen solchen Rückgabetypen zu verpassen? Das interessiert mich mal wirklich. Es gibt nämlich viele, die das falsch machen.</p>
</blockquote>
<p>Siehe oben. Ich habe irgendwie versucht mein Halbwissen zu nutzen.<br />
Wie bekomm ich es denn ohne kopieren richtig hin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053394</guid><dc:creator><![CDATA[Array]]></dc:creator><pubDate>Sat, 23 Apr 2011 21:06:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sat, 23 Apr 2011 21:45:46 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das interessiert mich mal wirklich. Es gibt nämlich viele, die das falsch machen.</p>
</blockquote>
<p>Hab ich doch <a href="http://www.c-plusplus.net/forum/p2023640#2023640" rel="nofollow">letztes Mal</a> zu erklären versucht <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>Nexus schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Rvalue-Referenzen sind REFERENZEN. Punkt. Ich kann mir beim besten Willen nicht erklären, warum so viele, die sich mit Rvalue-Referenzen beschäftigen, auf einmal Funktionen schreiben wollen, die Referenzen auf funktionslokale Objekte zurückgeben, die dann ungültig sind...</p>
</blockquote>
<p>Ich denke, das hängt damit zusammen, dass bisherige bekannte Konstrukte plötzlich eine neue Bedeutung bekommen. Bisher war klar, dass</p>
<pre><code class="language-cpp">MyClass Get();
</code></pre>
<p>eine Kopie erzeugt, im besten Fall noch mit (N)RVO wegoptimiert. Dass nun der gleiche Ausdruck ein implizites Move verursachen kann, wenn entsprechende Move-Konstruktoren definiert sind oder compilergeneriert werden, ist halt erst mal neu. Und da Move-Semantik zunächst immer mit RValue-Referenzen in Verbindung gebracht wird, scheint es naheliegend, dass man einen Move mit</p>
<pre><code class="language-cpp">MyClass&amp;&amp; Get();
</code></pre>
<p>kennzeichnet.</p>
</blockquote>
<p>Das ist halt das Problem, wenn man grundlegendste und allen bekannte Regeln auf einmal erweitert. Und über die Inkonsistenzen mit Perfect Fowarding und Templates müssen wir gar nicht erst reden, das artet wahrscheinlich eine Massen-Stolperfalle aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053404</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 23 Apr 2011 21:45:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::tr1::array in Initialisierungliste initialisieren on Sun, 24 Apr 2011 11:09:04 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;utility&gt;
#include &lt;array&gt;

template&lt;class Iter&gt;
inline void assign_helper(Iter) {}

template&lt;class Iter, class U, class...More&gt;
inline void assign_helper(Iter it, U&amp;&amp; u, More&amp;&amp;...more)
{
  *it = std::forward&lt;U&gt;(u);
  ++it;
  assign_helper(it,std::forward&lt;More&gt;(more)...);
}

template&lt;class T&gt;
std::array&lt;T,0&gt; make_array() { return std::array&lt;T,0&gt;(); }

template&lt;class T, class U, class...Args&gt;
std::array&lt;T,1+sizeof...(Args)&gt;
make_array(U&amp;&amp; u, Args&amp;&amp;...args)
{
  std::array&lt;T,1+sizeof...(Args)&gt; result;
  assign_helper(&amp;result[0],std::forward&lt;U&gt;(u),std::forward&lt;Args&gt;(args)...);
  return result;
}

int main()
{
  using namespace std;
  auto a = make_array&lt;long&gt;(1,2,3,5,8,13,21,34);
  int s = a.size();
  cout &lt;&lt; &quot;---&quot; &lt;&lt; endl;
  for (int i=0; i&lt;s; ++i) {
    cout &lt;&lt; a[i] &lt;&lt; '\n';
  }
  cout &lt;&lt; &quot;---&quot; &lt;&lt; endl;
}
</code></pre>
</blockquote>
<p>Sehr elegante Lösung <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/2053523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053523</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 24 Apr 2011 11:09:04 GMT</pubDate></item></channel></rss>