<div>Hi,</div><div><br></div><div>I have a doubt about this paragraph of [over.match.list] ...</div><div><br></div><blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-width:initial;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px">
<div>"If the initializer list has no elements and T has a default constructor, the first phase is omitted. In copy-listinitialization,</div><div>if an explicit constructor is chosen, the initialization is ill-formed. [ Note: This differs from</div>
<div>other situations (13.3.1.3, 13.3.1.4), where only converting constructors are considered for copy-initialization.</div><div>This restriction only applies if this initialization is part of the final result of overload resolution. —end note ]"</div>
</blockquote><div><br></div><div>According to the above, what should be the result of compiling the following code?</div><div><br></div><blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-width:initial;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px">
<div><font face="'courier new', monospace">// Begin code</font></div><div><font face="'courier new', monospace">#include <string></font></div><div><font face="'courier new', monospace">#include <utility></font></div>
<div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">struct like_std_string</font></div><div><font face="'courier new', monospace">{</font></div><div>
<font face="'courier new', monospace">  template<class InputIterator></font></div><div><font face="'courier new', monospace">  like_std_string(InputIterator begin, InputIterator end);      // This is a converting constructor.</font></div>
<div><font face="'courier new', monospace">};</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">struct my_string</font></div><div><font face="'courier new', monospace">{</font></div>
<div><font face="'courier new', monospace">  template<class InputIterator></font></div><div><font face="'courier new', monospace">  explicit my_string(InputIterator begin, InputIterator end);   // This is *not* a converting constructor.</font></div>
<div><font face="'courier new', monospace">};</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">void foo( like_std_string );</font></div>
<div><font face="'courier new', monospace">void foo( std::pair<std::string, std::string> );</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">void bar( my_string );</font></div>
<div><font face="'courier new', monospace">void bar( std::pair<std::string, std::string> );</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">int main( /* int argc, char* argv[] */ )</font></div>
<div><font face="'courier new', monospace">{</font></div><div><font face="'courier new', monospace">  foo( {"k0", "v0"} );<span class="Apple-tab-span" style="white-space:pre">   </span>// ambiguous in Clang (3.1) and GCC (4.7.1). OK, I think.</font></div>
<div><font face="'courier new', monospace">  bar( {"k0", "v0"} );<span class="Apple-tab-span" style="white-space:pre">      </span>// *Not* ambiguous in Clang. Ambiguous in GCC. Ambiguous to the Standard? I think should *not* be ambiguous.</font></div>
<div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">  return 0;</font></div><div><font face="'courier new', monospace">}</font></div><div><font face="'courier new', monospace"><br>
</font></div><div><font face="'courier new', monospace">// End code</font></div></blockquote><div><br></div><div>GCC and Clang disagree on the interpretation of Standard (?).</div><div><br></div><div>Is GCC wrong? Is Clang wrong? Is the Standard confusing?</div>
<div><br></div><div>I don't understand what is the intent of this paragraph (I think it would be good to add some examples to the paragraph.)</div><div>The final wording of "Initializer list" belongs to n2672 paper, which is based on n2640 paper.</div>
<div><br></div><div><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm</a></div><div><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2640.pdf">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2640.pdf</a></div>
<div><br></div><div>I think that n2640 mentions some important points about *explicit*, *converting constructors*, and *initializer-lists*.</div><div>I believe that only converting constructors should be considered for copy-initialization.</div>
<div>I don't know what were the reasons for considering all constructors, including the explicit constructors.</div><div><br></div><div>(I have no access to the mailing-list to find out what happened)</div><div><br></div>
<div>Thanks and Regards,</div><div>Fernando Pelliccioni.</div>