title: Returning a tuple from a function using uniform initialization syntax
body: <p>The following code compiles with clang (libc++) and fails with gcc (libstdc++). Why does gcc (libstdc++) complains about an initializer list? I thought the return argument was using uniform initialization syntax.</p>
  
  <pre><code>std::tuple&lt;double,double&gt; dummy() {
    return {2.0, 3.0};
  }
  
  int main() {   
    std::tuple&lt;double,double&gt; a = dummy();   
    return 0;
  }
  </code></pre>
  
  <blockquote>
    <p>Error: line 22: converting to ‘std::tuple’ from initializer \
    list would use explicit constructor ‘constexpr std::tuple&lt;_T1, _T2>::tuple(_U1&amp;\
    &amp;, _U2&amp;&amp;) [with _U1 = double; _U2 = double;  = void; _T\
    1 = double; _T2 = double]’  </p>
  </blockquote>
  
  <p><strong>Note:</strong> GCC (libstdc++) (and clang (libc++)) accept</p>
  
  <pre><code>std::tuple&lt;double,double&gt; dummy {1.0, 2.0};
  </code></pre>
  
  <p>Isn't it the same case?</p>
  
  <p><strong>Update:</strong> this is a libc++ extension, see <a href="http://llvm.org/bugs/show_bug.cgi?id=15299">http://llvm.org/bugs/show_bug.cgi?id=15299</a> and also answer by Howard Hinnant below.</p>