<?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: What Happened in&#160;Frankfurt?</title>
	<atom:link href="http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/feed/" rel="self" type="application/rss+xml" />
	<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/</link>
	<description>The next generation of C++</description>
	<lastBuildDate>Fri, 27 Jan 2012 17:36:04 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Andrzej Krzemieński</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-1696</link>
		<dc:creator>Andrzej Krzemieński</dc:creator>
		<pubDate>Thu, 03 Nov 2011 12:07:08 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-1696</guid>
		<description>&lt;p&gt;Ok, now I see. Only declaring a valid operation ++iter does not guarantee that it will be possible to use it in expression&lt;/p&gt;

&lt;pre&gt;++&#040;++iter&#041;&lt;/pre&gt;

&lt;p&gt;Even if I required that ++iter is only convertible to Iter&amp; the double increment expression would not work.&lt;/p&gt;

&lt;p&gt;My original concern about the valid expression of OutputIterator (*r = o) is also a bit misplaced. I guess it is more a deficiency in the concept OutputIterator than in concept support itself. Ideally it should be a function output(r, o), but STL concepts like C++ operators so much.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Ok, now I see. Only declaring a valid operation ++iter does not guarantee that it will be possible to use it in expression</p>

<pre>++&#040;++iter&#041;</pre>

<p>Even if I required that ++iter is only convertible to Iter&amp; the double increment expression would not work.</p>

<p>My original concern about the valid expression of OutputIterator (*r = o) is also a bit misplaced. I guess it is more a deficiency in the concept OutputIterator than in concept support itself. Ideally it should be a function output(r, o), but STL concepts like C++ operators so much.</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Dave Abrahams</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-1694</link>
		<dc:creator>Dave Abrahams</dc:creator>
		<pubDate>Sat, 29 Oct 2011 18:53:54 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-1694</guid>
		<description>&lt;p&gt;Well, that&#039;s quite interesting.  The “valid expressions” approach that
was proposed wasn&#039;t supposed to work as you describe.  In fact, its
proponents said that the use of valid expressions would allow
expression templates to work in constrained contexts, a feature which
would depend on &lt;em&gt;not&lt;/em&gt; applying conversions like the one you&#039;re
describing.  Those sorts of forced conversions were thus always
associated with pseudosignatures.  I grant you that this example can
be made to work if you take this step.&lt;/p&gt;

&lt;p&gt;There are other compelling arguments for pseudo-signatures, though.
Both approaches have equivalent expressive capability; the difference
is in what each one makes easy or hard to express.&lt;/p&gt;

&lt;p&gt;For example, pseudo-signatures make it absolutely dead-simple to
declare a new model of a concept: you declare a class whose body &lt;em&gt;is&lt;/em&gt;
the concept body, with a few mechanical changes.  With valid
expressions, you have to deduce a set of functions and associated
types from the expressions.&lt;/p&gt;

&lt;p&gt;Valid expressions make it much easier to write constraints that
unintentionally lock down the algorithm implementation.  You actually
have to try constraining a few algorithms to see what happens.  So,
without peeking ahead, write down the valid-expression constraints for
&lt;code&gt;std::find&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, is the following be a legal implementation according to your
constraints?  Should it be legal?&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;template&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&lt;&lt;/span&gt;InputIterator II, &lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; Value&lt;span style=&quot;color: #000080;&quot;&gt;&gt;&lt;/span&gt;
requires &lt;span style=&quot;color: #008000;&quot;&gt;&#123;&lt;/span&gt; … &lt;span style=&quot;color: #008000;&quot;&gt;&#125;&lt;/span&gt;
II find&lt;span style=&quot;color: #008000;&quot;&gt;&#040;&lt;/span&gt;II first, II last, Value &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;&amp;&lt;/span&gt; v&lt;span style=&quot;color: #008000;&quot;&gt;&#041;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&#040;&lt;/span&gt;first &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; last&lt;span style=&quot;color: #008000;&quot;&gt;&#041;&lt;/span&gt;
    &lt;span style=&quot;color: #008000;&quot;&gt;&#123;&lt;/span&gt;
         II&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;value_type&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;&amp;&lt;/span&gt; x &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;first&lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
         &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&#040;&lt;/span&gt;x &lt;span style=&quot;color: #000080;&quot;&gt;==&lt;/span&gt; v&lt;span style=&quot;color: #008000;&quot;&gt;&#041;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #008000;&quot;&gt;&#125;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; first&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
		<content:encoded><![CDATA[<p>Well, that&#8217;s quite interesting.  The “valid expressions” approach that
was proposed wasn&#8217;t supposed to work as you describe.  In fact, its
proponents said that the use of valid expressions would allow
expression templates to work in constrained contexts, a feature which
would depend on <em>not</em> applying conversions like the one you&#8217;re
describing.  Those sorts of forced conversions were thus always
associated with pseudosignatures.  I grant you that this example can
be made to work if you take this step.</p>

<p>There are other compelling arguments for pseudo-signatures, though.
Both approaches have equivalent expressive capability; the difference
is in what each one makes easy or hard to express.</p>

<p>For example, pseudo-signatures make it absolutely dead-simple to
declare a new model of a concept: you declare a class whose body <em>is</em>
the concept body, with a few mechanical changes.  With valid
expressions, you have to deduce a set of functions and associated
types from the expressions.</p>

<p>Valid expressions make it much easier to write constraints that
unintentionally lock down the algorithm implementation.  You actually
have to try constraining a few algorithms to see what happens.  So,
without peeking ahead, write down the valid-expression constraints for
<code>std::find</code>.</p>

<p>Now, is the following be a legal implementation according to your
constraints?  Should it be legal?</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span>InputIterator II, <span style="color: #0000ff;">class</span> Value<span style="color: #000080;">&gt;</span>
requires <span style="color: #008000;">&#123;</span> … <span style="color: #008000;">&#125;</span>
II find<span style="color: #008000;">&#40;</span>II first, II last, Value <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> v<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>first <span style="color: #000040;">!</span><span style="color: #000080;">=</span> last<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
         II<span style="color: #008080;">::</span><span style="color: #007788;">value_type</span> <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> x <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>first<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> v<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> first<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>]]></content:encoded>
	</item>
	<item>
		<title>By: Andrzej Krzemieński</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-1693</link>
		<dc:creator>Andrzej Krzemieński</dc:creator>
		<pubDate>Thu, 27 Oct 2011 10:00:44 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-1693</guid>
		<description>&lt;p&gt;Thanks for the example. I can now see why the SGI implementation of find is non-conforming in current C++ (without concept). I can see why the problem remains if I use Boost.Concept -- because I still use unconstrained templates, and the additional matching of archetypes against the concept does not change anything.&lt;/p&gt;

&lt;p&gt;But now, I wonder if this implementation would still be non-conforming if we had C++ concepts that use valid-expressions. If I have a nasty model where the result of operator== has custom operator!:&lt;/p&gt;

&lt;pre&gt;NastyBool operator==&#040; NastyT, NastyT &#041;;
void operator!&#040; NastyBool &#041;;&lt;/pre&gt;

&lt;p&gt;This nasty operator! should not be considered because it would not be visible inside find(). find() only sees my types &#039;through&#039; a concept, so I can only see operator==, but not operator!, so I have to apply the conversion from NastyBool to bool. Or am I wrong?&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Thanks for the example. I can now see why the SGI implementation of find is non-conforming in current C++ (without concept). I can see why the problem remains if I use Boost.Concept &#8212; because I still use unconstrained templates, and the additional matching of archetypes against the concept does not change anything.</p>

<p>But now, I wonder if this implementation would still be non-conforming if we had C++ concepts that use valid-expressions. If I have a nasty model where the result of operator== has custom operator!:</p>

<pre>NastyBool operator==&#040; NastyT, NastyT &#041;;
void operator!&#040; NastyBool &#041;;</pre>

<p>This nasty operator! should not be considered because it would not be visible inside find(). find() only sees my types &#8216;through&#8217; a concept, so I can only see operator==, but not operator!, so I have to apply the conversion from NastyBool to bool. Or am I wrong?</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Dave Abrahams</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-1692</link>
		<dc:creator>Dave Abrahams</dc:creator>
		<pubDate>Thu, 27 Oct 2011 02:35:51 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-1692</guid>
		<description>&lt;p&gt;Yes, it was equally controversial.&lt;/p&gt;

&lt;p&gt;Would it surprise you to learn that the implementation of &lt;code&gt;find&lt;/code&gt; you pasted has been carefully engineered to avoid the problem?  The &lt;a href=&quot;http://www.sgi.com/tech/stl/stl_algo.h&quot; rel=&quot;nofollow&quot;&gt;SGI STL implementation&lt;/a&gt; (almost certainly identical to the original STL algorithm) was:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;template&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&lt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; _InputIter, &lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; _Tp&lt;span style=&quot;color: #000080;&quot;&gt;&gt;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;inline&lt;/span&gt; _InputIter find&lt;span style=&quot;color: #008000;&quot;&gt;&#040;&lt;/span&gt;_InputIter __first, _InputIter __last,
                       &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; _Tp&lt;span style=&quot;color: #000040;&quot;&gt;&amp;&lt;/span&gt; __val,
                       input_iterator_tag&lt;span style=&quot;color: #008000;&quot;&gt;&#041;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&#123;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&#040;&lt;/span&gt;__first &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; __last &lt;span style=&quot;color: #000040;&quot;&gt;&amp;&amp;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&#040;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;__first &lt;span style=&quot;color: #000080;&quot;&gt;==&lt;/span&gt; __val&lt;span style=&quot;color: #008000;&quot;&gt;&#041;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&#041;&lt;/span&gt;
    &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;__first&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; __first&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Believe it or not, the above is actually a nonconforming implementation!  Convertibility to &lt;code&gt;bool&lt;/code&gt; of the &lt;code&gt;operator==&lt;/code&gt; result is not sufficient to ensure it compiles.  I think any system in which the original STL authors would have to struggle to meet their own requirements clauses for something as trivial as &lt;code&gt;find&lt;/code&gt; is problematic.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Yes, it was equally controversial.</p>

<p>Would it surprise you to learn that the implementation of <code>find</code> you pasted has been carefully engineered to avoid the problem?  The <a href="http://www.sgi.com/tech/stl/stl_algo.h" rel="nofollow">SGI STL implementation</a> (almost certainly identical to the original STL algorithm) was:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> _InputIter, <span style="color: #0000ff;">class</span> _Tp<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">inline</span> _InputIter find<span style="color: #008000;">&#40;</span>_InputIter __first, _InputIter __last,
                       <span style="color: #0000ff;">const</span> _Tp<span style="color: #000040;">&amp;</span> __val,
                       input_iterator_tag<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>__first <span style="color: #000040;">!</span><span style="color: #000080;">=</span> __last <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>__first <span style="color: #000080;">==</span> __val<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #000040;">++</span>__first<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> __first<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Believe it or not, the above is actually a nonconforming implementation!  Convertibility to <code>bool</code> of the <code>operator==</code> result is not sufficient to ensure it compiles.  I think any system in which the original STL authors would have to struggle to meet their own requirements clauses for something as trivial as <code>find</code> is problematic.</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Andrzej KrzemieÅ„ski</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-1691</link>
		<dc:creator>Andrzej KrzemieÅ„ski</dc:creator>
		<pubDate>Wed, 26 Oct 2011 21:45:54 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-1691</guid>
		<description>&lt;p&gt;Hi, It appears that the explicit-vs-implicit modelling of a concept was the most fundamental difference between Indiana and Texas concepts. Now, I wonder about the decision on pseudo-signatures vs. valid expressions. Was it also equally controversial? 
I did not write many concepts myself, so my perspective may be limited, but I tend to lean towards valid expressions. Perhaps it is because I only used Boost.Concept library. In the rationale in N1758, I read that with valid expressions I can get a surprising behavior, but the example&lt;/p&gt;

&lt;pre&gt;return x &lt; y &amp;&amp; random&#040;&#041; % 3;&lt;/pre&gt;

&lt;p&gt;appears to me a non-real-life one. I also read that &quot;Standard library vendors have already had to deal with this problem, e.g., for find.&quot; Could you expand on it a bit more? I have looked at the implementation of find in my STL implementation:&lt;/p&gt;

&lt;pre&gt;template&lt;class _InIt,
    class _Ty&gt; inline
    _InIt _Find&#040;_InIt _First, _InIt _Last, const _Ty&amp; _Val&#041;
    &#123;   // find first matching _Val
    for &#040;; _First != _Last; ++_First&#041;
        if &#040;*_First == _Val&#041;
            break;
    return &#040;_First&#041;;
    &#125;&lt;/pre&gt;

&lt;p&gt;And it does not appear that the result of operator== that is not bool, but convertible to bool would render a surprising behavior.&lt;/p&gt;

&lt;p&gt;I understand that there might be more technical difficulties (or impossibilities) in implementing &quot;valid expressions&quot;, but as the &quot;end consumer&quot; of C++ I find valid expressions simpler in some situations. For instance, if I wanted to write a concept for OutputIterator, I require that the following expression is valid:&lt;/p&gt;

&lt;pre&gt;*r = o&lt;/pre&gt;

&lt;p&gt;I do not (want to) care what the result type of operator* is or if assignment returns void or some value. In a constrained function template I will just be putting statements *r = o; and this is all I am asking for.&lt;/p&gt;

&lt;p&gt;Regards.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Hi, It appears that the explicit-vs-implicit modelling of a concept was the most fundamental difference between Indiana and Texas concepts. Now, I wonder about the decision on pseudo-signatures vs. valid expressions. Was it also equally controversial? 
I did not write many concepts myself, so my perspective may be limited, but I tend to lean towards valid expressions. Perhaps it is because I only used Boost.Concept library. In the rationale in N1758, I read that with valid expressions I can get a surprising behavior, but the example</p>

<pre>return x &lt; y &amp;&amp; random&#040;&#041; % 3;</pre>

<p>appears to me a non-real-life one. I also read that &#8220;Standard library vendors have already had to deal with this problem, e.g., for find.&#8221; Could you expand on it a bit more? I have looked at the implementation of find in my STL implementation:</p>

<pre>template&lt;class _InIt,
    class _Ty&gt; inline
    _InIt _Find&#040;_InIt _First, _InIt _Last, const _Ty&amp; _Val&#041;
    &#123;   // find first matching _Val
    for &#040;; _First != _Last; ++_First&#041;
        if &#040;*_First == _Val&#041;
            break;
    return &#040;_First&#041;;
    &#125;</pre>

<p>And it does not appear that the result of operator== that is not bool, but convertible to bool would render a surprising behavior.</p>

<p>I understand that there might be more technical difficulties (or impossibilities) in implementing &#8220;valid expressions&#8221;, but as the &#8220;end consumer&#8221; of C++ I find valid expressions simpler in some situations. For instance, if I wanted to write a concept for OutputIterator, I require that the following expression is valid:</p>

<pre>*r = o</pre>

<p>I do not (want to) care what the result type of operator* is or if assignment returns void or some value. In a constrained function template I will just be putting statements *r = o; and this is all I am asking for.</p>

<p>Regards.</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Doug Gregor</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-32</link>
		<dc:creator>Doug Gregor</dc:creator>
		<pubDate>Tue, 25 Aug 2009 01:01:45 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-32</guid>
		<description>&lt;blockquote cite=&quot;comment-85&quot;&gt;

&lt;strong&gt;&lt;a href=&quot;#comment-85&quot; rel=&quot;nofollow&quot;&gt;Rodrigo&lt;/a&gt;&lt;/strong&gt;:
However, I really hate the number of explicit concepts the ID tends to generate. I find the fact that BackInsertionContainer and friends are explicit embarassing considering they are refinements of another explicit concept: Container. If a type is explicitly told to be a Container, they should be able to automatically match the mentioned refinements. If the types are’t Containers, they shouldn’t.
&lt;/blockquote&gt;

&lt;p&gt;Once the &quot;root&quot; concept is explicit, in most cases it doesn&#039;t require any more concept maps even if all of the more-refined concepts are explicit. This is because of the way we tend to use concept maps: we write one concept map for the most specific concept (e.g., RandomAccessIterator rather than Iterator, BackInsertionContainer rather than Container), and the compiler implicitly generates concept maps for the less-specific concepts.&lt;/p&gt;

&lt;blockquote cite=&quot;comment-85&quot;&gt;

&lt;strong&gt;&lt;a href=&quot;#comment-85&quot; rel=&quot;nofollow&quot;&gt;Rodrigo&lt;/a&gt;&lt;/strong&gt;: Doug came with a rationale on why it wasn’t this way. My opinion is that it was a wrong decision. Other options may exist. For example, we could have: concept, auto concept, explicit concept. &lt;a href=&quot;http://zone-team.com.mx/temp/c2.cpp&quot; rel=&quot;nofollow&quot;&gt;http://zone-team.com.mx/temp/c2.cpp&lt;/a&gt; summarizes my thoughts.
&lt;/blockquote&gt;

&lt;p&gt;You can actually get this kind of behavior from the current concepts proposal, by using associated requirements rather than refinement. Check out how the OutputIterator concept is specified, which boils down to this:&lt;/p&gt;

&lt;pre&gt;concept Iterator&lt;typename Iter&gt; &#123;
  // basic iterator requirements
&#125;
&#160;
auto concept OutputIterator&lt;typename Iter, typename Value&gt; &#123;
  requires Iterator&lt;Iter&gt;;
  // assignability requirements to allow, e.g., *i = value
&#125;&lt;/pre&gt;

&lt;p&gt;Here, Iterator is an explicit concept, so you need to write a concept map for it (or one of its more-refined concepts, like RandomAccessIterator) to &quot;opt in&quot; to the iterator system. Then, however, you get the OutputIterator concept automatically matched for your iterator types for any Value type that can be assigned to the reference type of the iterator. I think this gives basically the same capability as the non-auto, non-explicit concepts in your example, and it has definitely come in handy in the Standard Library.&lt;/p&gt;

&lt;p&gt;Thanks for coming out to share ideas and comments; it&#039;s great to see different perspectives on a feature like Concepts.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<blockquote cite="comment-85">

<strong><a href="#comment-85" rel="nofollow">Rodrigo</a></strong>:
However, I really hate the number of explicit concepts the ID tends to generate. I find the fact that BackInsertionContainer and friends are explicit embarassing considering they are refinements of another explicit concept: Container. If a type is explicitly told to be a Container, they should be able to automatically match the mentioned refinements. If the types are’t Containers, they shouldn’t.
</blockquote>

<p>Once the &#8220;root&#8221; concept is explicit, in most cases it doesn&#8217;t require any more concept maps even if all of the more-refined concepts are explicit. This is because of the way we tend to use concept maps: we write one concept map for the most specific concept (e.g., RandomAccessIterator rather than Iterator, BackInsertionContainer rather than Container), and the compiler implicitly generates concept maps for the less-specific concepts.</p>

<blockquote cite="comment-85">

<strong><a href="#comment-85" rel="nofollow">Rodrigo</a></strong>: Doug came with a rationale on why it wasn’t this way. My opinion is that it was a wrong decision. Other options may exist. For example, we could have: concept, auto concept, explicit concept. <a href="http://zone-team.com.mx/temp/c2.cpp" rel="nofollow">http://zone-team.com.mx/temp/c2.cpp</a> summarizes my thoughts.
</blockquote>

<p>You can actually get this kind of behavior from the current concepts proposal, by using associated requirements rather than refinement. Check out how the OutputIterator concept is specified, which boils down to this:</p>

<pre>concept Iterator&lt;typename Iter&gt; &#123;
  // basic iterator requirements
&#125;
&nbsp;
auto concept OutputIterator&lt;typename Iter, typename Value&gt; &#123;
  requires Iterator&lt;Iter&gt;;
  // assignability requirements to allow, e.g., *i = value
&#125;</pre>

<p>Here, Iterator is an explicit concept, so you need to write a concept map for it (or one of its more-refined concepts, like RandomAccessIterator) to &#8220;opt in&#8221; to the iterator system. Then, however, you get the OutputIterator concept automatically matched for your iterator types for any Value type that can be assigned to the reference type of the iterator. I think this gives basically the same capability as the non-auto, non-explicit concepts in your example, and it has definitely come in handy in the Standard Library.</p>

<p>Thanks for coming out to share ideas and comments; it&#8217;s great to see different perspectives on a feature like Concepts.</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Rodrigo</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-30</link>
		<dc:creator>Rodrigo</dc:creator>
		<pubDate>Sat, 22 Aug 2009 21:35:19 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-30</guid>
		<description>&lt;p&gt;Yes, its easy to say that but that&#039;s why I didn&#039;t attempt to criticize Indiana&#039;s design (ID) more deeply.&lt;/p&gt;

&lt;p&gt;I consider ID more convenient than TD. In fact, my full opposition to the &quot;nothing-is-explicit&quot; or the &quot;explicit-refinement-only&quot; alternatives is because they are subsets of the ID in terms of power.&lt;/p&gt;

&lt;p&gt;However, I really hate the number of explicit concepts the ID tends to generate. I find the fact that BackInsertionContainer and friends are explicit embarassing considering they are refinements of another explicit concept: Container. If a type is explicitly told to be a Container, they should be able to automatically match the mentioned refinements. If the types are&#039;t Containers, they shouldn&#039;t.&lt;/p&gt;

&lt;p&gt;Doug came with a rationale on why it wasn&#039;t this way. My opinion is that it was a wrong decision. Other options may exist. For example, we could have: concept, auto concept, explicit concept. http://zone-team.com.mx/temp/c2.cpp summarizes my thoughts.&lt;/p&gt;

&lt;p&gt;The optimal solution is between &quot;too much explicit&quot; and &quot;explicit enough&quot;. And no, TD isn&#039;t &quot;explicit enough&quot;. ID is closer to that lower bound than TD is.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Yes, its easy to say that but that&#8217;s why I didn&#8217;t attempt to criticize Indiana&#8217;s design (ID) more deeply.</p>

<p>I consider ID more convenient than TD. In fact, my full opposition to the &#8220;nothing-is-explicit&#8221; or the &#8220;explicit-refinement-only&#8221; alternatives is because they are subsets of the ID in terms of power.</p>

<p>However, I really hate the number of explicit concepts the ID tends to generate. I find the fact that BackInsertionContainer and friends are explicit embarassing considering they are refinements of another explicit concept: Container. If a type is explicitly told to be a Container, they should be able to automatically match the mentioned refinements. If the types are&#8217;t Containers, they shouldn&#8217;t.</p>

<p>Doug came with a rationale on why it wasn&#8217;t this way. My opinion is that it was a wrong decision. Other options may exist. For example, we could have: concept, auto concept, explicit concept. <a href="http://zone-team.com.mx/temp/c2.cpp" rel="nofollow">http://zone-team.com.mx/temp/c2.cpp</a> summarizes my thoughts.</p>

<p>The optimal solution is between &#8220;too much explicit&#8221; and &#8220;explicit enough&#8221;. And no, TD isn&#8217;t &#8220;explicit enough&#8221;. ID is closer to that lower bound than TD is.</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Adf3m</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-31</link>
		<dc:creator>Adf3m</dc:creator>
		<pubDate>Sat, 22 Aug 2009 19:52:31 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-31</guid>
		<description>&lt;p&gt;I know how much work you and your associates put into Concepts and how disappointing it is when something you have worked on eventually fails to make the cut.&lt;/p&gt;

&lt;p&gt;I am sure the decision we reached in Frankfurt was the right one for both C++ and Concepts. And certainly this was not a decision to kill Concepts but to give it more time so that we could produce a well honed feature to include in the release of C++ after C++0x.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I know how much work you and your associates put into Concepts and how disappointing it is when something you have worked on eventually fails to make the cut.</p>

<p>I am sure the decision we reached in Frankfurt was the right one for both C++ and Concepts. And certainly this was not a decision to kill Concepts but to give it more time so that we could produce a well honed feature to include in the release of C++ after C++0x.</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Dave Abrahams</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-29</link>
		<dc:creator>Dave Abrahams</dc:creator>
		<pubDate>Sat, 22 Aug 2009 17:44:09 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-29</guid>
		<description>&lt;blockquote cite=&quot;comment-81&quot;&gt;

&lt;strong&gt;&lt;a href=&quot;#comment-81&quot; rel=&quot;nofollow&quot;&gt;Rodrigo&lt;/a&gt;&lt;/strong&gt;: I think the optimal solution may be somewhere between
&lt;/blockquote&gt;

&lt;p&gt;Hi Rodrigo,&lt;/p&gt;

&lt;p&gt;The question is, in between what and what?  It&#039;s very easy to say that the right answer probably lies between two competing points of view, but the proposal that was voted into the WP already has optional implicit matching (auto concepts).&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<blockquote cite="comment-81">

<strong><a href="#comment-81" rel="nofollow">Rodrigo</a></strong>: I think the optimal solution may be somewhere between
</blockquote>

<p>Hi Rodrigo,</p>

<p>The question is, in between what and what?  It&#8217;s very easy to say that the right answer probably lies between two competing points of view, but the proposal that was voted into the WP already has optional implicit matching (auto concepts).</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Rodrigo</title>
		<link>http://cpp-next.com/archive/2009/08/what-happened-in-frankfurt/comment-page-1/#comment-28</link>
		<dc:creator>Rodrigo</dc:creator>
		<pubDate>Fri, 21 Aug 2009 21:53:20 +0000</pubDate>
		<guid isPermaLink="false">http://cpp-next.com/?p=122#comment-28</guid>
		<description>&lt;p&gt;Hi Doug.&lt;/p&gt;

&lt;p&gt;I see. I think the optimal solution may be somewhere between, but it seems it starts getting more complicated (at least without a whole redesign). Thanks for your reply.&lt;/p&gt;

&lt;p&gt;And thanks to Dave for fixing my code!&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Hi Doug.</p>

<p>I see. I think the optimal solution may be somewhere between, but it seems it starts getting more complicated (at least without a whole redesign). Thanks for your reply.</p>

<p>And thanks to Dave for fixing my code!</p>]]></content:encoded>
	</item>
</channel>
</rss>

