<?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::foreach-Verhalten (mit boost::bind) vs. BOOST_FOREACH-Verhalten mit Referenzen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hatte heute eine etwas exotischere Situtation die vereinfacht so aussieht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;boost/foreach.hpp&gt;
#include &lt;boost/bind.hpp&gt;

void f( int&amp; ri, std::vector&lt;int&gt;&amp; vi )
{
   std::cout &lt;&lt; &amp;ri &lt;&lt; std::endl;

   BOOST_FOREACH( int &amp;i, vi )
   {
      std::cout &lt;&lt; &amp;i &lt;&lt; std::endl;
      i += ri;
   }
   std::cout &lt;&lt; &quot;---&quot; &lt;&lt; std::endl;
}

int main()
{
   std::vector&lt;int&gt; vi;
   vi.push_back( 1 );
   vi.push_back( 2 );
   vi.push_back( 3 );

   std::cout &lt;&lt; &amp;vi[ 0 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &amp;vi[ 1 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &amp;vi[ 2 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &quot;---&quot; &lt;&lt; std::endl;

   std::for_each( vi.begin(), vi.end(), boost::bind( f, _1, vi ) );

   BOOST_FOREACH( int &amp;i, vi )
   {
      std::cout &lt;&lt; i &lt;&lt; std::endl;
   }

   std::cout &lt;&lt; &quot;==========================&quot; &lt;&lt; std::endl;

   std::vector&lt;int&gt; vi2;
   vi2.push_back( 1 );
   vi2.push_back( 2 );
   vi2.push_back( 3 );

   std::cout &lt;&lt; &amp;vi2[ 0 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &amp;vi2[ 1 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &amp;vi2[ 2 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &quot;---&quot; &lt;&lt; std::endl;

   BOOST_FOREACH( int &amp;i, vi2 )
   {
      f( i, vi2 );
   }

   BOOST_FOREACH( int &amp;i, vi2 )
   {
      std::cout &lt;&lt; i &lt;&lt; std::endl;
   }
}
</code></pre>
<p>Die Ausgabe sieht so aus:</p>
<blockquote>
<h1>002351A0<br />
002351A4<br />
002351A8<br />
---<br />
002351A0<br />
00235230<br />
00235234<br />
00235238<br />
---<br />
002351A4<br />
00235230<br />
00235234<br />
00235238<br />
---<br />
002351A8<br />
00235230<br />
00235234<br />
00235238<br />
---<br />
1<br />
2<br />
3</h1>
<p>002352B8<br />
002352BC<br />
002352C0<br />
---<br />
002352B8<br />
002352B8<br />
002352BC<br />
002352C0<br />
---<br />
002352BC<br />
002352B8<br />
002352BC<br />
002352C0<br />
---<br />
002352C0<br />
002352B8<br />
002352BC<br />
002352C0<br />
---<br />
19<br />
21<br />
26</p>
</blockquote>
<p>Die Variante mit BOOST_FOREACH() funktioniert wie erwartet, die Variante mit std::for_each scheint den std::vector zu kopieren (was ich halbwegs überraschend finde).<br />
Kann mir das einer erklären?<br />
Ich würde vermuten, dass es irgendetwas mit boost::bind und Referenzen auf Referenzen (bzw. der Vermeidung solcher) zu tun hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300189/std-foreach-verhalten-mit-boost-bind-vs-boost_foreach-verhalten-mit-referenzen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 22:00:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300189.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Feb 2012 14:34:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::foreach-Verhalten (mit boost::bind) vs. BOOST_FOREACH-Verhalten mit Referenzen on Mon, 27 Feb 2012 14:34:18 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hatte heute eine etwas exotischere Situtation die vereinfacht so aussieht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;boost/foreach.hpp&gt;
#include &lt;boost/bind.hpp&gt;

void f( int&amp; ri, std::vector&lt;int&gt;&amp; vi )
{
   std::cout &lt;&lt; &amp;ri &lt;&lt; std::endl;

   BOOST_FOREACH( int &amp;i, vi )
   {
      std::cout &lt;&lt; &amp;i &lt;&lt; std::endl;
      i += ri;
   }
   std::cout &lt;&lt; &quot;---&quot; &lt;&lt; std::endl;
}

int main()
{
   std::vector&lt;int&gt; vi;
   vi.push_back( 1 );
   vi.push_back( 2 );
   vi.push_back( 3 );

   std::cout &lt;&lt; &amp;vi[ 0 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &amp;vi[ 1 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &amp;vi[ 2 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &quot;---&quot; &lt;&lt; std::endl;

   std::for_each( vi.begin(), vi.end(), boost::bind( f, _1, vi ) );

   BOOST_FOREACH( int &amp;i, vi )
   {
      std::cout &lt;&lt; i &lt;&lt; std::endl;
   }

   std::cout &lt;&lt; &quot;==========================&quot; &lt;&lt; std::endl;

   std::vector&lt;int&gt; vi2;
   vi2.push_back( 1 );
   vi2.push_back( 2 );
   vi2.push_back( 3 );

   std::cout &lt;&lt; &amp;vi2[ 0 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &amp;vi2[ 1 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &amp;vi2[ 2 ] &lt;&lt; std::endl;
   std::cout &lt;&lt; &quot;---&quot; &lt;&lt; std::endl;

   BOOST_FOREACH( int &amp;i, vi2 )
   {
      f( i, vi2 );
   }

   BOOST_FOREACH( int &amp;i, vi2 )
   {
      std::cout &lt;&lt; i &lt;&lt; std::endl;
   }
}
</code></pre>
<p>Die Ausgabe sieht so aus:</p>
<blockquote>
<h1>002351A0<br />
002351A4<br />
002351A8<br />
---<br />
002351A0<br />
00235230<br />
00235234<br />
00235238<br />
---<br />
002351A4<br />
00235230<br />
00235234<br />
00235238<br />
---<br />
002351A8<br />
00235230<br />
00235234<br />
00235238<br />
---<br />
1<br />
2<br />
3</h1>
<p>002352B8<br />
002352BC<br />
002352C0<br />
---<br />
002352B8<br />
002352B8<br />
002352BC<br />
002352C0<br />
---<br />
002352BC<br />
002352B8<br />
002352BC<br />
002352C0<br />
---<br />
002352C0<br />
002352B8<br />
002352BC<br />
002352C0<br />
---<br />
19<br />
21<br />
26</p>
</blockquote>
<p>Die Variante mit BOOST_FOREACH() funktioniert wie erwartet, die Variante mit std::for_each scheint den std::vector zu kopieren (was ich halbwegs überraschend finde).<br />
Kann mir das einer erklären?<br />
Ich würde vermuten, dass es irgendetwas mit boost::bind und Referenzen auf Referenzen (bzw. der Vermeidung solcher) zu tun hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186241</guid><dc:creator><![CDATA[void*]]></dc:creator><pubDate>Mon, 27 Feb 2012 14:34:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::foreach-Verhalten (mit boost::bind) vs. BOOST_FOREACH-Verhalten mit Referenzen on Mon, 27 Feb 2012 15:25:29 GMT]]></title><description><![CDATA[<p><code>boost::bind</code> kopiert die Argumente. Woher soll die Funktion auch wissen, dass sie nur eine Referenz binden soll?<br />
Du kannst hier <s>boost::cref</s> <code>boost::ref</code> nehmen.</p>
<pre><code class="language-cpp">boost::bind(f, _1, boost::ref(vi))
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2186263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186263</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 27 Feb 2012 15:25:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::foreach-Verhalten (mit boost::bind) vs. BOOST_FOREACH-Verhalten mit Referenzen on Mon, 27 Feb 2012 15:15:59 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antwort!</p>
<p>Ich war davon ausgegangen, dass er automatisch eine &amp; nimmt (die sollte dann aber eigentlich const sein... <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="🙄"
    /> und das würde auch wieder nicht funktionieren).</p>
<p>Allerdings muss es in meinem Bsp. eine</p>
<pre><code class="language-cpp">boost::ref
</code></pre>
<p>ohne c sein, da über die Referenz modifiziert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186270</guid><dc:creator><![CDATA[void*]]></dc:creator><pubDate>Mon, 27 Feb 2012 15:15:59 GMT</pubDate></item><item><title><![CDATA[Reply to std::foreach-Verhalten (mit boost::bind) vs. BOOST_FOREACH-Verhalten mit Referenzen on Mon, 27 Feb 2012 16:40:10 GMT]]></title><description><![CDATA[<p>Mit C++11 gibt es eigentlich keinen Grund mehr, BOOST_FORAECH zu benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186305</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 27 Feb 2012 16:40:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::foreach-Verhalten (mit boost::bind) vs. BOOST_FOREACH-Verhalten mit Referenzen on Mon, 27 Feb 2012 16:48:01 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Mit C++11 gibt es eigentlich keinen Grund mehr, BOOST_FORAECH zu benutzen.</p>
</blockquote>
<p>Nur wird es noch eine Weile dauern, bis Range-Based-For soweit unterstützt wird, dass man damit portabel programmieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186307</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 27 Feb 2012 16:48:01 GMT</pubDate></item><item><title><![CDATA[Reply to std::foreach-Verhalten (mit boost::bind) vs. BOOST_FOREACH-Verhalten mit Referenzen on Tue, 28 Feb 2012 08:33:54 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Mit C++11 gibt es eigentlich keinen Grund mehr, BOOST_FORAECH zu benutzen.</p>
</blockquote>
<p>Das ist richtig, aber ich hänge hier am VS2005 Compiler und deswegen ist nix mit C++11.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186478</guid><dc:creator><![CDATA[void*]]></dc:creator><pubDate>Tue, 28 Feb 2012 08:33:54 GMT</pubDate></item></channel></rss>