<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: Requirement Propagation and CopyConstructible</title>
	<atom:link href="http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/feed/" rel="self" type="application/rss+xml" />
	<link>http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/</link>
	<description>The Design and Implementation of Concepts for C++</description>
	<lastBuildDate>Thu, 06 Aug 2009 18:19:18 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: gfaraj</title>
		<link>http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/#comment-614</link>
		<dc:creator>gfaraj</dc:creator>
		<pubDate>Tue, 08 May 2007 15:33:05 +0000</pubDate>
		<guid isPermaLink="false">http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/#comment-614</guid>
		<description>Thanks for the clarification Douglas. I understand now the reasoning of removing the compiler-generated requirements. It does make sense and goes along with the usual desire of the C++ community to reduce the amount of coupling between the language and the standard library. Thanks again.</description>
		<content:encoded><![CDATA[<p>Thanks for the clarification Douglas. I understand now the reasoning of removing the compiler-generated requirements. It does make sense and goes along with the usual desire of the C++ community to reduce the amount of coupling between the language and the standard library. Thanks again.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Douglas Gregor</title>
		<link>http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/#comment-613</link>
		<dc:creator>Douglas Gregor</dc:creator>
		<pubDate>Tue, 08 May 2007 13:38:30 +0000</pubDate>
		<guid isPermaLink="false">http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/#comment-613</guid>
		<description>Sorry, I wrote up all of the rationale behind the removal of this feature in a note to the C++ committee, but did not include the motivation here. Here&#039;s an excerpt with the motivation for this decision:

Previously (and in ConceptGCC), we propagated the requirement
std::CopyConstructible&lt;T&gt; for argument and return types. With the
introduction of rvalue references, we changed this to
std::MoveConstructible&lt;T&gt;, because one can move values into arguments
and out of the return type. This change has exposed two issues:

   1) Users---not the compiler---should be deciding between
      MoveConstructible and CopyConstructible.

   2) If future changes to C++ mean that one can construct arguments
      without requiring a copy or move constructor, we would either
      have our templates over-constrained, or we would have to break
      code that relies on requirement propagation. Both are bad
      outcomes.

Due to these problems, and the coupling of the MoveConstructible
concept with the compiler, we want to remove requirement propagation
of MoveConstructible from argument and return types in a declaration.</description>
		<content:encoded><![CDATA[<p>Sorry, I wrote up all of the rationale behind the removal of this feature in a note to the C++ committee, but did not include the motivation here. Here&#8217;s an excerpt with the motivation for this decision:</p>
<p>Previously (and in ConceptGCC), we propagated the requirement<br />
std::CopyConstructible&lt;T&gt; for argument and return types. With the<br />
introduction of rvalue references, we changed this to<br />
std::MoveConstructible&lt;T&gt;, because one can move values into arguments<br />
and out of the return type. This change has exposed two issues:</p>
<p>   1) Users&#8212;not the compiler&#8212;should be deciding between<br />
      MoveConstructible and CopyConstructible.</p>
<p>   2) If future changes to C++ mean that one can construct arguments<br />
      without requiring a copy or move constructor, we would either<br />
      have our templates over-constrained, or we would have to break<br />
      code that relies on requirement propagation. Both are bad<br />
      outcomes.</p>
<p>Due to these problems, and the coupling of the MoveConstructible<br />
concept with the compiler, we want to remove requirement propagation<br />
of MoveConstructible from argument and return types in a declaration.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Niels Dekker</title>
		<link>http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/#comment-586</link>
		<dc:creator>Niels Dekker</dc:creator>
		<pubDate>Sat, 05 May 2007 09:20:28 +0000</pubDate>
		<guid isPermaLink="false">http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/#comment-586</guid>
		<description>Thanks for your information, Doug!  Like gfaraj, I&#039;d be interested to know why this &quot;requirement propagation&quot; had to be removed. It seemed to me like a very convenient feature!  But you got me even more confused, because your quote from N2193, [temp.req.prop] paragraph 2, differs slightly from the paper at http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2193.pdf

n2193.pdf says:
bool eq(T x, T y); // implicitly adds requirement MoveConstructible

Do you agree that once the MoveConstructible concept is included with ConceptGCC, &#039;T negate(const T&amp;)&#039; should require MoveConstructible, instead of CopyConstructible?</description>
		<content:encoded><![CDATA[<p>Thanks for your information, Doug!  Like gfaraj, I&#8217;d be interested to know why this &#8220;requirement propagation&#8221; had to be removed. It seemed to me like a very convenient feature!  But you got me even more confused, because your quote from N2193, [temp.req.prop] paragraph 2, differs slightly from the paper at <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2193.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2193.pdf</a></p>
<p>n2193.pdf says:<br />
bool eq(T x, T y); // implicitly adds requirement MoveConstructible</p>
<p>Do you agree that once the MoveConstructible concept is included with ConceptGCC, &#8216;T negate(const T&amp;)&#8217; should require MoveConstructible, instead of CopyConstructible?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: gfaraj</title>
		<link>http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/#comment-585</link>
		<dc:creator>gfaraj</dc:creator>
		<pubDate>Sat, 05 May 2007 06:14:43 +0000</pubDate>
		<guid isPermaLink="false">http://conceptgcc.wordpress.com/2007/05/03/requirement-propagation-and-copyconstructible/#comment-585</guid>
		<description>Wait... I&#039;m a little confused. Why doesn&#039;t ConceptGCC compile the negate template as firstly shown? Why do we need to specify the CopyConstructible requirement, when the return type of negate implicitly states that T must be copy constructible? Maybe I&#039;m misunderstanding the post, can someone clarify, please? Thanks!</description>
		<content:encoded><![CDATA[<p>Wait&#8230; I&#8217;m a little confused. Why doesn&#8217;t ConceptGCC compile the negate template as firstly shown? Why do we need to specify the CopyConstructible requirement, when the return type of negate implicitly states that T must be copy constructible? Maybe I&#8217;m misunderstanding the post, can someone clarify, please? Thanks!</p>
]]></content:encoded>
	</item>
</channel>
</rss>
