<?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[Eigene Impl der std::initializer_list funktioniert nicht]]></title><description><![CDATA[<p>Hi, ich habe eine eigene Container Klasse programmiert, die ich nun mit einer &quot;initializer_list&quot; versehen wollte. Z.B. so:</p>
<pre><code>template &lt;class T&gt;
MyContainer&lt;T&gt;::MyContainer(std::initializer_list&lt;T&gt; initializer) :
	_items(new T[(int)initializer.size()]),
	_size((int)initializer.size())
{
	std::copy(initializer.begin(), initializer.end(), _items);
}
</code></pre>
<p>Das funktioniert auch wie erwartet (GCC/Linux).<br />
Allerdings möchte ich die Standard Lib nicht verwenden und habe mir die Implementierung des GCC kopiert und den namespace von std in test umbenannt (siehe unten):</p>
<pre><code>template &lt;class T&gt;
MyContainer&lt;T&gt;::MyContainer(test::initializer_list&lt;T&gt; initializer) :
	_items(new T[(int)initializer.size()]),
	_size((int)initializer.size())
{
	std::copy(initializer.begin(), initializer.end(), _items);
}
</code></pre>
<p>Blöderweise funktioniert das ganze nun nicht mehr. Wer kann mir erklären warum?<br />
<a href="https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a01223.html" rel="nofollow">https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a01223.html</a></p>
<p>Die Implementierung von Apple funktioniert wenn ich diese kopiere leider auch nicht.<br />
<a href="https://opensource.apple.com/source/libcpp/libcpp-31/include/initializer_list" rel="nofollow">https://opensource.apple.com/source/libcpp/libcpp-31/include/initializer_list</a></p>
<pre><code>namespace test
{

template&lt;class _E&gt;
class initializer_list
{
public:
	typedef _E        		value_type;
	typedef const _E&amp;     	reference;
	typedef const _E&amp;     	const_reference;
	typedef size_t        	size_type;
	typedef const _E*     	iterator;
	typedef const _E*     	const_iterator;

private:
	iterator          _M_array;
	size_type         _M_len;

	constexpr initializer_list(const_iterator __a, size_type __l)
	: _M_array(__a), _M_len(__l) { }

public:
	constexpr initializer_list() : _M_array(0), _M_len(0) { }

	constexpr size_type
	size() { return _M_len; }

	constexpr const_iterator
	begin() { return _M_array; }

	constexpr const_iterator
	end() { return begin() + size(); }
};

template&lt;class _Tp&gt;
	constexpr const _Tp*
	begin(initializer_list&lt;_Tp&gt; __ils)
{ return __ils.begin(); }

template&lt;class _Tp&gt;
	constexpr const _Tp*
	end(initializer_list&lt;_Tp&gt; __ils)
{ return __ils.end(); }

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/339931/eigene-impl-der-std-initializer_list-funktioniert-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 15:20:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339931.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Oct 2016 22:21:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigene Impl der std::initializer_list funktioniert nicht on Sat, 08 Oct 2016 22:21:01 GMT]]></title><description><![CDATA[<p>Hi, ich habe eine eigene Container Klasse programmiert, die ich nun mit einer &quot;initializer_list&quot; versehen wollte. Z.B. so:</p>
<pre><code>template &lt;class T&gt;
MyContainer&lt;T&gt;::MyContainer(std::initializer_list&lt;T&gt; initializer) :
	_items(new T[(int)initializer.size()]),
	_size((int)initializer.size())
{
	std::copy(initializer.begin(), initializer.end(), _items);
}
</code></pre>
<p>Das funktioniert auch wie erwartet (GCC/Linux).<br />
Allerdings möchte ich die Standard Lib nicht verwenden und habe mir die Implementierung des GCC kopiert und den namespace von std in test umbenannt (siehe unten):</p>
<pre><code>template &lt;class T&gt;
MyContainer&lt;T&gt;::MyContainer(test::initializer_list&lt;T&gt; initializer) :
	_items(new T[(int)initializer.size()]),
	_size((int)initializer.size())
{
	std::copy(initializer.begin(), initializer.end(), _items);
}
</code></pre>
<p>Blöderweise funktioniert das ganze nun nicht mehr. Wer kann mir erklären warum?<br />
<a href="https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a01223.html" rel="nofollow">https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a01223.html</a></p>
<p>Die Implementierung von Apple funktioniert wenn ich diese kopiere leider auch nicht.<br />
<a href="https://opensource.apple.com/source/libcpp/libcpp-31/include/initializer_list" rel="nofollow">https://opensource.apple.com/source/libcpp/libcpp-31/include/initializer_list</a></p>
<pre><code>namespace test
{

template&lt;class _E&gt;
class initializer_list
{
public:
	typedef _E        		value_type;
	typedef const _E&amp;     	reference;
	typedef const _E&amp;     	const_reference;
	typedef size_t        	size_type;
	typedef const _E*     	iterator;
	typedef const _E*     	const_iterator;

private:
	iterator          _M_array;
	size_type         _M_len;

	constexpr initializer_list(const_iterator __a, size_type __l)
	: _M_array(__a), _M_len(__l) { }

public:
	constexpr initializer_list() : _M_array(0), _M_len(0) { }

	constexpr size_type
	size() { return _M_len; }

	constexpr const_iterator
	begin() { return _M_array; }

	constexpr const_iterator
	end() { return begin() + size(); }
};

template&lt;class _Tp&gt;
	constexpr const _Tp*
	begin(initializer_list&lt;_Tp&gt; __ils)
{ return __ils.begin(); }

template&lt;class _Tp&gt;
	constexpr const _Tp*
	end(initializer_list&lt;_Tp&gt; __ils)
{ return __ils.end(); }

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2510999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510999</guid><dc:creator><![CDATA[InitializerList]]></dc:creator><pubDate>Sat, 08 Oct 2016 22:21:01 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Impl der std::initializer_list funktioniert nicht on Sat, 08 Oct 2016 22:33:53 GMT]]></title><description><![CDATA[<p>Fehlermeldung ist übrigens:</p>
<blockquote>
<p>error: could not convert ‘{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 42, 100}’ from ‘&lt;brace-enclosed initializer list&gt;’ to ‘MyContainer&lt;int&gt;’<br />
MyContainer&lt;int&gt; container = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 , 14, 15, 42, 100 };</p>
</blockquote>
<p>Ich habe nur die GCC Implementierung in meinen Code kopiert und den &quot;std&quot; namespace zwecks Eindeutigkeit des Klassennamens in &quot;test&quot; umbenannt. Mit der originalen &quot;std::initializer_list&quot; gehts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511000</guid><dc:creator><![CDATA[InitializerList]]></dc:creator><pubDate>Sat, 08 Oct 2016 22:33:53 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Impl der std::initializer_list funktioniert nicht on Sat, 08 Oct 2016 22:36:25 GMT]]></title><description><![CDATA[<p>Wie wird aus {...} eine test::initializer_list?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511001</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 08 Oct 2016 22:36:25 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Impl der std::initializer_list funktioniert nicht on Sat, 08 Oct 2016 22:45:33 GMT]]></title><description><![CDATA[<p>Keine Ahnung, das ist doch die &quot;Magie&quot; dieses neuen initializer_list Features von C++14. Meine Vermutung war, dass der Compiler anhand der führenden doppelten Unterstriche erkennt, dass es für ihn reservierte Variablen sind und den Konstruktor der sogar privat ist dann aufruft und die größe des dynamischen Arrays an den size_t Parameter übergibt. Das war ja das Problem, dass man nachträglich die größe eines dynamischen Arrays nicht mehr feststellen konnte. Ansonsten könnte man sich diese Klasse ja auch sparen.</p>
<pre><code>// The compiler can call a private constructor.
constexpr initializer_list(const_iterator __a, size_type __l)
: _M_array(__a), _M_len(__l) { }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2511002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511002</guid><dc:creator><![CDATA[InitializerList]]></dc:creator><pubDate>Sat, 08 Oct 2016 22:45:33 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Impl der std::initializer_list funktioniert nicht on Sat, 08 Oct 2016 22:46:38 GMT]]></title><description><![CDATA[<p>Übrigens hier mal ein Testprogramm:</p>
<p><a href="https://ideone.com/nNi4QX" rel="nofollow">https://ideone.com/nNi4QX</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511003</guid><dc:creator><![CDATA[InitializerList]]></dc:creator><pubDate>Sat, 08 Oct 2016 22:46:38 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Impl der std::initializer_list funktioniert nicht on Sat, 08 Oct 2016 23:01:05 GMT]]></title><description><![CDATA[<p>Oh man, das darf doch nicht wahr sein. Ich hatte schon vermutet dass diese initializer_list eine absolute frickel scheiße ist. Und wie es aussieht ist das wirklich so:</p>
<p><a href="https://stackoverflow.com/questions/247538/which-standard-c-classes-cannot-be-reimplemented-in-c" rel="nofollow">https://stackoverflow.com/questions/247538/which-standard-c-classes-cannot-be-reimplemented-in-c</a></p>
<p>Anstatt ein wiederverwendbares Feature hinzuzufügen, scheint dies and die initializer_list gekoppelt zu sein. Sprich man muss immer diese Klasse benutzen und kann dies agr nicht in einer eigenen implementierung nachbilden. Sitzen in diesem C++ Gremium eigentlich nur noch grauhaarige Vollidition... Mann mannn mann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511006</guid><dc:creator><![CDATA[InitilizerList]]></dc:creator><pubDate>Sat, 08 Oct 2016 23:01:05 GMT</pubDate></item></channel></rss>