<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Making Your Next&#160;Move</title>
	<atom:link href="http://cpp-next.com/archive/2009/09/making-your-next-move/feed/" rel="self" type="application/rss+xml" />
	<link>http://cpp-next.com/archive/2009/09/making-your-next-move/</link>
	<description>The next generation of C++</description>
	<lastBuildDate>Mon, 30 Apr 2012 15:07:48 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
	<item>
		<title>By: Dave Abrahams</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-211</link>
		<dc:creator>Dave Abrahams</dc:creator>
		<pubDate>Sat, 27 Feb 2010 18:01:49 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-211</guid>
		<description>&lt;p&gt;I think you got it!&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I think you got it!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Torsten T. Will</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-210</link>
		<dc:creator>Torsten T. Will</dc:creator>
		<pubDate>Sat, 20 Feb 2010 14:40:37 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-210</guid>
		<description>&lt;p&gt;I was playing around with RValues for a good explanation what they are. Your article series helps me a lot!&lt;/p&gt;

&lt;p&gt;I wanted to figure out an example to explain RValue References and was starting an example with the code (similar to your vector factory):&lt;/p&gt;

&lt;pre&gt;
struct BigThing {
  explicit BigThing(int i);
  BigThing(BigThing&amp;&amp;);  //move
  BigThing(BigThing&amp;) = deleted;  //no copy
};

BigThing create_big_thing(int i) {
  BigThing ver1(i/2); // prevent construction
  BigThing ver2(i*3+1); //... in place of &#039;bt&#039;
  return i%2==0 ? ver1 : ver2;
}
int main() {
  BigThing bt = create_big_thing(66);
}
&lt;/pre&gt;

&lt;p&gt;I was a bit surprised that the compiler accepted that, but pleased. Move is better then Copy. I looked up [class.copy] and found in paragraph 20 the explanation of &lt;i&gt;&quot;overload resolution with an rvalue first&quot;&lt;/i&gt;. Great -- so it&#039;s safe to delete Copy but implement Move to force high-perf code only.&lt;/p&gt;

&lt;p&gt;But then I remembered your example and Howards explanation:&lt;/p&gt;

&lt;pre&gt;
  Matrix operator+(Matrix&amp;&amp; temp, Matrix&amp;&amp; y)
  { temp += y; return std::move(temp); }
&lt;/pre&gt;

&lt;p&gt;Here the &quot;move&quot; is necessary because &lt;code&gt;y&lt;/code&gt; must be treated as an &lt;i&gt;lvalue&lt;/i&gt; inside the function. Ok, I understood that. But whats the difference? Ah, paragraph 19: &lt;i&gt;&quot;[only] when the expression is the name of an automatic object&quot;&lt;/i&gt;. That fits, &lt;code&gt;y&lt;/code&gt; is not an automatic object.&lt;/p&gt;

&lt;p&gt;Ok, complicated, but I think I got it. I just want to make sure here, I don&#039;t want to use examples and doing the explanations wrong.&lt;/p&gt;

&lt;p&gt;Did I get that right?&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I was playing around with RValues for a good explanation what they are. Your article series helps me a lot!</p>

<p>I wanted to figure out an example to explain RValue References and was starting an example with the code (similar to your vector factory):</p>

<pre>
struct BigThing {
  explicit BigThing(int i);
  BigThing(BigThing&amp;&amp;);  //move
  BigThing(BigThing&amp;) = deleted;  //no copy
};

BigThing create_big_thing(int i) {
  BigThing ver1(i/2); // prevent construction
  BigThing ver2(i*3+1); //... in place of 'bt'
  return i%2==0 ? ver1 : ver2;
}
int main() {
  BigThing bt = create_big_thing(66);
}
</pre>

<p>I was a bit surprised that the compiler accepted that, but pleased. Move is better then Copy. I looked up [class.copy] and found in paragraph 20 the explanation of <i>&#8220;overload resolution with an rvalue first&#8221;</i>. Great &#8212; so it&#8217;s safe to delete Copy but implement Move to force high-perf code only.</p>

<p>But then I remembered your example and Howards explanation:</p>

<pre>
  Matrix operator+(Matrix&amp;&amp; temp, Matrix&amp;&amp; y)
  { temp += y; return std::move(temp); }
</pre>

<p>Here the &#8220;move&#8221; is necessary because <code>y</code> must be treated as an <i>lvalue</i> inside the function. Ok, I understood that. But whats the difference? Ah, paragraph 19: <i>&#8220;[only] when the expression is the name of an automatic object&#8221;</i>. That fits, <code>y</code> is not an automatic object.</p>

<p>Ok, complicated, but I think I got it. I just want to make sure here, I don&#8217;t want to use examples and doing the explanations wrong.</p>

<p>Did I get that right?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jonathan Graehl</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-209</link>
		<dc:creator>Jonathan Graehl</dc:creator>
		<pubDate>Wed, 28 Oct 2009 22:21:24 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-209</guid>
		<description>&lt;p&gt;Surely it would be good to specify just 1 (or at worst 2) of the 4 &quot;commutative binary operation&quot; implementations and get an equivalent outcome.  Is there a preprocessor macro that manages?&lt;/p&gt;

&lt;p&gt;I also agree that it&#039;s too bad that the compiler won&#039;t put move(a) around the last use of a for me.&lt;/p&gt;

&lt;p&gt;Not breaking old code is a nice ideal, but in my code I use similar to:&lt;/p&gt;

&lt;pre&gt;string const&amp; b = &quot;1&quot;+string(&quot;2&quot;);&lt;/pre&gt;

&lt;p&gt;And apparently that will no longer work, so it&#039;s not like old code is actually sacred.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Surely it would be good to specify just 1 (or at worst 2) of the 4 &#8220;commutative binary operation&#8221; implementations and get an equivalent outcome.  Is there a preprocessor macro that manages?</p>

<p>I also agree that it&#8217;s too bad that the compiler won&#8217;t put move(a) around the last use of a for me.</p>

<p>Not breaking old code is a nice ideal, but in my code I use similar to:</p>

<pre>string const&amp; b = &quot;1&quot;+string(&quot;2&quot;);</pre>

<p>And apparently that will no longer work, so it&#8217;s not like old code is actually sacred.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: James Hopkin</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-208</link>
		<dc:creator>James Hopkin</dc:creator>
		<pubDate>Fri, 16 Oct 2009 10:55:30 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-208</guid>
		<description>&lt;blockquote cite=&quot;comment-235&quot;&gt;

&lt;strong&gt;&lt;a href=&quot;#comment-235&quot; rel=&quot;nofollow&quot;&gt;Thomas Klimpel&lt;/a&gt;&lt;/strong&gt;: (c) calling “swap” with a pointer to a derived object is a really bad idea (worse than slicing), but it is impossible to forbid it.

Problems (a) is already actively being discussed for moving, and the automatic move generation tries to address (b). With respect to problem (c), someone once told me that it’s a good idea to only inherit from abstract classes. So as long as the abstract classes take care to declare the swap member function as protected, everything is fine.
&lt;/blockquote&gt;

&lt;p&gt;To avoid move problems, we can be less restrictive than requiring inheritance only of abstract classes in OO hierarchies. Scott Meyers&#039; advice (Effective C++) that bases not have public copy operations is sufficient if it&#039;s extended to move operations (including swap).&lt;/p&gt;

&lt;p&gt;Another case to consider is when public inheritance is used to compose value types (not for polymorphism). Here slicing is possible, and perhaps occasionally desirable. Move operations seem to work naturally here too. &#039;Move slicing&#039; might steal one resource but leave another to be cleaned up by the original object.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<blockquote cite="comment-235">

<strong><a href="#comment-235" rel="nofollow">Thomas Klimpel</a></strong>: (c) calling “swap” with a pointer to a derived object is a really bad idea (worse than slicing), but it is impossible to forbid it.

Problems (a) is already actively being discussed for moving, and the automatic move generation tries to address (b). With respect to problem (c), someone once told me that it’s a good idea to only inherit from abstract classes. So as long as the abstract classes take care to declare the swap member function as protected, everything is fine.
</blockquote>

<p>To avoid move problems, we can be less restrictive than requiring inheritance only of abstract classes in OO hierarchies. Scott Meyers&#8217; advice (Effective C++) that bases not have public copy operations is sufficient if it&#8217;s extended to move operations (including swap).</p>

<p>Another case to consider is when public inheritance is used to compose value types (not for polymorphism). Here slicing is possible, and perhaps occasionally desirable. Move operations seem to work naturally here too. &#8216;Move slicing&#8217; might steal one resource but leave another to be cleaned up by the original object.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dave Abrahams</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-207</link>
		<dc:creator>Dave Abrahams</dc:creator>
		<pubDate>Thu, 15 Oct 2009 19:47:28 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-207</guid>
		<description>&lt;blockquote cite=&quot;comment-235&quot;&gt;

&lt;strong&gt;&lt;a href=&quot;#comment-235&quot; rel=&quot;nofollow&quot;&gt;Thomas Klimpel&lt;/a&gt;&lt;/strong&gt;: I’m just a bit unhappy that moving turns into something significantly more complicated than swapping.
&lt;/blockquote&gt;

&lt;p&gt;I think move is &lt;em&gt;fundamentally&lt;/em&gt; more complicated because it is asymmetric.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<blockquote cite="comment-235">

<strong><a href="#comment-235" rel="nofollow">Thomas Klimpel</a></strong>: I’m just a bit unhappy that moving turns into something significantly more complicated than swapping.
</blockquote>

<p>I think move is <em>fundamentally</em> more complicated because it is asymmetric.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Thomas Klimpel</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-206</link>
		<dc:creator>Thomas Klimpel</dc:creator>
		<pubDate>Thu, 15 Oct 2009 19:24:05 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-206</guid>
		<description>&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;#comment-234&quot; rel=&quot;nofollow&quot;&gt;Dave Abrahams&lt;/a&gt;&lt;/strong&gt;:
Of course, saying that doesn’t help us choose one answer or the other. So we’re still left with efficiency and resilience as the two useful criteria.
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;If it would just be about efficiency and resilience, I would go for resilience (because a simple check for self-assignment won&#039;t loose too much efficiency anyway). What I don&#039;t like about the resilience option is that it might provoke even more non-trivial boilerplate code in my classes, if I&#039;m unwilling to give up even more efficiency (by implementing move assignment with a call to the move constructor followed by a call to swap).&lt;/p&gt;

&lt;p&gt;The other part of the problem is to formulate the decision in precise words. And it would be nice if even the non-native speaking reader...&lt;/p&gt;

&lt;p&gt;But one final honest word: Move support will soon be widely available, the currently agreed upon interpretation of moving is quite different from &#039;“std::move(a)” can be treated like a true temporary object&#039;, so going with the resilient option and allow self-move-assignment would at least be consequent.&lt;/p&gt;

&lt;blockquote cite=&quot;comment-234&quot;&gt;
I don’t really understand anything you’re saying after this part (especially not your use of the word “twisted”), but the following gives me the sense you think the committee is being somehow inconsistent in supporting automatic move generation.
&lt;/blockquote&gt;

&lt;p&gt;I&#039;m not a native speaker, so I don&#039;t know about the connotations of &quot;twisted&quot;. I used it with the following meaning in mind:&lt;/p&gt;

&lt;p&gt;&quot;twist&quot; = &quot;trick&quot;&lt;/p&gt;

&lt;p&gt;&quot;twisted&quot; = &quot;not completely trivial&quot;&lt;/p&gt;

&lt;p&gt;The committee is consistent in supporting automatic move generation, because the copy constructor and assignment operator also get generated automatically. And it will help indeed for the problems that it tries to address.&lt;/p&gt;

&lt;p&gt;I&#039;m just a bit unhappy that moving turns into something significantly more complicated than swapping. And I have the impression that moving will inherit some of the problems swapping has:&lt;/p&gt;

&lt;p&gt;(a) &quot;swap&quot; should be relatively cheap and don&#039;t throw, otherwise it will be much less useful.&lt;/p&gt;

&lt;p&gt;(b) A reasonable swap can&#039;t be added to an existing class without modifying the source code of the class definition.&lt;/p&gt;

&lt;p&gt;(c) calling &quot;swap&quot; with a pointer to a derived object is a really bad idea (worse than slicing), but it is impossible to forbid it.&lt;/p&gt;

&lt;p&gt;Problems (a) is already actively being discussed for moving, and the automatic move generation tries to address (b). With respect to problem (c), someone once told me that it&#039;s a good idea to only inherit from abstract classes. So as long as the abstract classes take care to declare the swap member function as protected, everything is fine. I don&#039;t know whether the automatically generated move member functions will take care of this detail, or whether such details are important after all.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p><strong><a href="#comment-234" rel="nofollow">Dave Abrahams</a></strong>:
Of course, saying that doesn’t help us choose one answer or the other. So we’re still left with efficiency and resilience as the two useful criteria.
</p>

<p>If it would just be about efficiency and resilience, I would go for resilience (because a simple check for self-assignment won&#8217;t loose too much efficiency anyway). What I don&#8217;t like about the resilience option is that it might provoke even more non-trivial boilerplate code in my classes, if I&#8217;m unwilling to give up even more efficiency (by implementing move assignment with a call to the move constructor followed by a call to swap).</p>

<p>The other part of the problem is to formulate the decision in precise words. And it would be nice if even the non-native speaking reader&#8230;</p>

<p>But one final honest word: Move support will soon be widely available, the currently agreed upon interpretation of moving is quite different from &#8216;“std::move(a)” can be treated like a true temporary object&#8217;, so going with the resilient option and allow self-move-assignment would at least be consequent.</p>

<blockquote cite="comment-234">
I don’t really understand anything you’re saying after this part (especially not your use of the word “twisted”), but the following gives me the sense you think the committee is being somehow inconsistent in supporting automatic move generation.
</blockquote>

<p>I&#8217;m not a native speaker, so I don&#8217;t know about the connotations of &#8220;twisted&#8221;. I used it with the following meaning in mind:</p>

<p>&#8220;twist&#8221; = &#8220;trick&#8221;</p>

<p>&#8220;twisted&#8221; = &#8220;not completely trivial&#8221;</p>

<p>The committee is consistent in supporting automatic move generation, because the copy constructor and assignment operator also get generated automatically. And it will help indeed for the problems that it tries to address.</p>

<p>I&#8217;m just a bit unhappy that moving turns into something significantly more complicated than swapping. And I have the impression that moving will inherit some of the problems swapping has:</p>

<p>(a) &#8220;swap&#8221; should be relatively cheap and don&#8217;t throw, otherwise it will be much less useful.</p>

<p>(b) A reasonable swap can&#8217;t be added to an existing class without modifying the source code of the class definition.</p>

<p>(c) calling &#8220;swap&#8221; with a pointer to a derived object is a really bad idea (worse than slicing), but it is impossible to forbid it.</p>

<p>Problems (a) is already actively being discussed for moving, and the automatic move generation tries to address (b). With respect to problem (c), someone once told me that it&#8217;s a good idea to only inherit from abstract classes. So as long as the abstract classes take care to declare the swap member function as protected, everything is fine. I don&#8217;t know whether the automatically generated move member functions will take care of this detail, or whether such details are important after all.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dave Abrahams</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-205</link>
		<dc:creator>Dave Abrahams</dc:creator>
		<pubDate>Thu, 15 Oct 2009 16:35:14 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-205</guid>
		<description>&lt;blockquote cite=&quot;comment-233&quot;&gt;

&lt;strong&gt;&lt;a href=&quot;#comment-233&quot; rel=&quot;nofollow&quot;&gt;Thomas Klimpel&lt;/a&gt;&lt;/strong&gt;: somebody should defend the strict position that “a=std::move(a)” is not legal for a general “a”.
&lt;/blockquote&gt;

&lt;p&gt;Sounds like that somebody might be you&lt;/p&gt;

&lt;blockquote cite=&quot;comment-233&quot;&gt;
 I don’t think that this position is any more wrong or right than the opposite position
&lt;/blockquote&gt;

&lt;p&gt;Agreed&lt;/p&gt;

&lt;blockquote cite=&quot;comment-233&quot;&gt;I think the advantages of clear responsibilities are more important than some lost optimization opportunities.
&lt;/blockquote&gt;

&lt;p&gt;That&#039;s a very good point.  Of course, saying that doesn&#039;t help us choose one answer or the other. So we&#039;re still left with efficiency and resilience as the two useful criteria.&lt;/p&gt;

&lt;p&gt;I don&#039;t really understand anything you&#039;re saying after this part (especially not your use of the word &quot;twisted&quot;), but the following gives me the sense you think the committee is being somehow inconsistent in supporting automatic move generation.&lt;/p&gt;

&lt;blockquote cite=&quot;comment-233&quot;&gt;
Adding support for automatic generation of swap member functions to the c++ language was always a no-go, but now that the move member functions get so twisted, adding automatic generation for them to the c++ language is suddenly welcomed as a good idea.
&lt;/blockquote&gt;
</description>
		<content:encoded><![CDATA[<blockquote cite="comment-233">

<strong><a href="#comment-233" rel="nofollow">Thomas Klimpel</a></strong>: somebody should defend the strict position that “a=std::move(a)” is not legal for a general “a”.
</blockquote>

<p>Sounds like that somebody might be you</p>

<blockquote cite="comment-233">
 I don’t think that this position is any more wrong or right than the opposite position
</blockquote>

<p>Agreed</p>

<blockquote cite="comment-233">I think the advantages of clear responsibilities are more important than some lost optimization opportunities.
</blockquote>

<p>That&#8217;s a very good point.  Of course, saying that doesn&#8217;t help us choose one answer or the other. So we&#8217;re still left with efficiency and resilience as the two useful criteria.</p>

<p>I don&#8217;t really understand anything you&#8217;re saying after this part (especially not your use of the word &#8220;twisted&#8221;), but the following gives me the sense you think the committee is being somehow inconsistent in supporting automatic move generation.</p>

<blockquote cite="comment-233">
Adding support for automatic generation of swap member functions to the c++ language was always a no-go, but now that the move member functions get so twisted, adding automatic generation for them to the c++ language is suddenly welcomed as a good idea.
</blockquote>
]]></content:encoded>
	</item>
	<item>
		<title>By: Thomas Klimpel</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-204</link>
		<dc:creator>Thomas Klimpel</dc:creator>
		<pubDate>Thu, 15 Oct 2009 16:18:39 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-204</guid>
		<description>&lt;p&gt;No, I say that I overlooked the twist in Howard’s text when I first read it. I don&#039;t know how Howard intents to use the back door he left by using proposed language, but it could clearly be used to allow self-move-assignment under certain circumstances (i.e. when the moved from object is empty).&lt;/p&gt;

&lt;p&gt;My initial point was that somebody should defend the strict position that “a=std::move(a)” is not legal for a general “a”. I don&#039;t think that this position is any more wrong or right than the opposite position that “a=std::move(a)” is legal for a general “a”.&lt;/p&gt;

&lt;p&gt;From my point of view, it is a question of responsibility assignment. Does the caller has to ensure that &quot;std::move(a)&quot; can be treated like a true temporary object? Or does the called function has to ensure that nothing goes wrong? I think the advantages of clear responsibilities are more important than some lost optimization opportunities.&lt;/p&gt;

&lt;p&gt;You may think that the unfixed swap example will always work in practice, but what about a class that actually asserts on self-move-assignment, even if the moved from object is empty? Sure this would be easy to fix by excluding the empty case from the assertion, but the question would remain, whether it is the calling function that is buggy or the called function. Is the called function allowed to assert at all, even for a self-move-assignment from a non-empty object? The caller might use an old std algorithm with a move_iterator and don&#039;t care about the behavior in case of self-move-assignment, as long as the program doesn&#039;t crash (or stops on an assert).&lt;/p&gt;

&lt;p&gt;The interesting thing about this is that it&#039;s not some boost-library that has to write the move member functions, but me as the individual programmer. Adding support for automatic generation of swap member functions to the c++ language was always a no-go, but now that the move member functions get so twisted, adding automatic generation for them to the c++ language is suddenly welcomed as a good idea. The funny thing is that automatically generated swap member functions would probably be much less error prone than automatically generated move member functions.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>No, I say that I overlooked the twist in Howard’s text when I first read it. I don&#8217;t know how Howard intents to use the back door he left by using proposed language, but it could clearly be used to allow self-move-assignment under certain circumstances (i.e. when the moved from object is empty).</p>

<p>My initial point was that somebody should defend the strict position that “a=std::move(a)” is not legal for a general “a”. I don&#8217;t think that this position is any more wrong or right than the opposite position that “a=std::move(a)” is legal for a general “a”.</p>

<p>From my point of view, it is a question of responsibility assignment. Does the caller has to ensure that &#8220;std::move(a)&#8221; can be treated like a true temporary object? Or does the called function has to ensure that nothing goes wrong? I think the advantages of clear responsibilities are more important than some lost optimization opportunities.</p>

<p>You may think that the unfixed swap example will always work in practice, but what about a class that actually asserts on self-move-assignment, even if the moved from object is empty? Sure this would be easy to fix by excluding the empty case from the assertion, but the question would remain, whether it is the calling function that is buggy or the called function. Is the called function allowed to assert at all, even for a self-move-assignment from a non-empty object? The caller might use an old std algorithm with a move_iterator and don&#8217;t care about the behavior in case of self-move-assignment, as long as the program doesn&#8217;t crash (or stops on an assert).</p>

<p>The interesting thing about this is that it&#8217;s not some boost-library that has to write the move member functions, but me as the individual programmer. Adding support for automatic generation of swap member functions to the c++ language was always a no-go, but now that the move member functions get so twisted, adding automatic generation for them to the c++ language is suddenly welcomed as a good idea. The funny thing is that automatically generated swap member functions would probably be much less error prone than automatically generated move member functions.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dave Abrahams</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-203</link>
		<dc:creator>Dave Abrahams</dc:creator>
		<pubDate>Thu, 08 Oct 2009 19:34:16 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-203</guid>
		<description>&lt;p&gt;So, IIUC, you&#039;re saying that the proposed language allows for some standard functions, which state otherwise, to accomodate self-move-assignment?&lt;/p&gt;

&lt;p&gt;If that&#039;s what you&#039;re saying, I guess I don&#039;t see how it relates to your earlier point.  Or maybe I didn&#039;t get your earlier point.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>So, IIUC, you&#8217;re saying that the proposed language allows for some standard functions, which state otherwise, to accomodate self-move-assignment?</p>

<p>If that&#8217;s what you&#8217;re saying, I guess I don&#8217;t see how it relates to your earlier point.  Or maybe I didn&#8217;t get your earlier point.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Thomas Klimpel</title>
		<link>http://cpp-next.com/archive/2009/09/making-your-next-move/comment-page-1/#comment-202</link>
		<dc:creator>Thomas Klimpel</dc:creator>
		<pubDate>Thu, 08 Oct 2009 19:01:57 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=559#comment-202</guid>
		<description>&lt;p&gt;If self-move assignment would be allowed, no move-assignment operator of the C++ standard library would not be able to assume that the (rhs) parameter is a unique reference to the (rhs) argument.&lt;/p&gt;

&lt;p&gt;Of course you can invent twists to get around this simple logic conclusion. I reread&lt;/p&gt;

&lt;p&gt;http://home.roadrunner.com/~hinnant/issue_review/lwg-active.html#1204&lt;/p&gt;

&lt;p&gt;And indeed, it uses a twist to get around my simple logic conclusion by writing: &quot;Each of the following statements applies to all arguments to functions defined in the C++ standard library, UNLESS EXPLICITLY STATED OTHERWISE.&quot;&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>If self-move assignment would be allowed, no move-assignment operator of the C++ standard library would not be able to assume that the (rhs) parameter is a unique reference to the (rhs) argument.</p>

<p>Of course you can invent twists to get around this simple logic conclusion. I reread</p>

<p><a href="http://home.roadrunner.com/~hinnant/issue_review/lwg-active.html#1204" rel="nofollow">http://home.roadrunner.com/~hinnant/issue_review/lwg-active.html#1204</a></p>

<p>And indeed, it uses a twist to get around my simple logic conclusion by writing: &#8220;Each of the following statements applies to all arguments to functions defined in the C++ standard library, UNLESS EXPLICITLY STATED OTHERWISE.&#8221;</p>
]]></content:encoded>
	</item>
</channel>
</rss>

