<div dir="ltr">Ok then.  I tested on MSVC and it works too.  I guess I got into the habit of doing that for old versions of MSVC as a workaround.  Maybe it didn't used to be able to disambiguate this correctly.</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Sep 27, 2016 at 9:21 AM David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Tue, Sep 27, 2016 at 9:03 AM Zachary Turner <<a href="mailto:zturner@google.com" class="gmail_msg" target="_blank">zturner@google.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">zturner added inline comments.<br class="gmail_msg">
<br class="gmail_msg">
================<br class="gmail_msg">
Comment at: include/llvm/ADT/StringExtras.h:226<br class="gmail_msg">
@@ +225,3 @@<br class="gmail_msg">
+  return join_one_item_size(A) +<br class="gmail_msg">
+         join_items_size(B, std::forward<Args>(Items)...);<br class="gmail_msg">
+}<br class="gmail_msg">
----------------<br class="gmail_msg">
mehdi_amini wrote:<br class="gmail_msg">
> Do you need the B in this function?<br class="gmail_msg">
My understanding is that it is needed to disambiguate the two overloads.  If you have these two:<br class="gmail_msg">
<br class="gmail_msg">
```<br class="gmail_msg">
template <typename A1><br class="gmail_msg">
size_t join_items_size(const A1 &A) {<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
template<typename A1, typename... As><br class="gmail_msg">
size_t join_items_size(const A1 &A, As &&... Items) {<br class="gmail_msg">
}<br class="gmail_msg">
```<br class="gmail_msg">
<br class="gmail_msg">
Then if you call it as:<br class="gmail_msg">
<br class="gmail_msg">
```<br class="gmail_msg">
size_t x = join_items_size("Test");<br class="gmail_msg">
```<br class="gmail_msg">
<br class="gmail_msg">
it will be ambiguous, because the second overload could have a parameter pack of size 0.  Correct me if I'm wrong though, I admit I am not an expert here :)<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">A cursory test seems to work OK (does not have ambiguity):<br class="gmail_msg"><br class="gmail_msg"><div class="gmail_msg">$ cat a.cpp</div><div class="gmail_msg">template<typename T></div><div class="gmail_msg">void f(const T&);</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">template<typename T, typename... Ts></div><div class="gmail_msg">void f(const T&, const Ts&...) = delete;</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">void caller() {</div><div class="gmail_msg">  f(3);</div><div class="gmail_msg">}</div><div class="gmail_msg">$ clang++-tot -std=c++11 a.cpp -fsyntax-only</div><div class="gmail_msg">$</div></div><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D24880" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D24880</a><br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div></div>
</blockquote></div>