title: Why does Foo({}) invoke Foo(0) instead of Foo()?
body: <p>Executables produced by clang 3.5.0 and gcc 4.9.1 from the code</p>
  
  <pre><code>#include &lt;iostream&gt;
  
  struct Foo
  {
     Foo() { std::cout &lt;&lt; "Foo()" &lt;&lt; std::endl; }
     Foo(int x) { std::cout &lt;&lt; "Foo(int = " &lt;&lt; x &lt;&lt; ")" &lt;&lt; std::endl; }
     Foo(int x, int y) { std::cout &lt;&lt; "Foo(int = " &lt;&lt; x &lt;&lt; ", int = " &lt;&lt; y &lt;&lt; ")" &lt;&lt; std::endl; }
  };
  
  int main()                 // Output
  {                          // ---------------------
     auto a = Foo();         // Foo()
     auto b = Foo(1);        // Foo(int = 1)
     auto c = Foo(2, 3);     // Foo(int = 2, int = 3)
     auto d = Foo{};         // Foo()
     auto e = Foo{1};        // Foo(int = 1)
     auto f = Foo{2, 3};     // Foo(int = 2, int = 3)
     auto g = Foo({});       // Foo(int = 0)          &lt;&lt;&lt; Why?
     auto h = Foo({1});      // Foo(int = 1)
     auto i = Foo({2, 3});   // Foo(int = 2, int = 3)
  }
  </code></pre>
  
  <p>behave as commented.</p>
  
  <p>From <a href="http://en.cppreference.com/mwiki/index.php?title=cpp/language/list_initialization&amp;oldid=72490" rel="nofollow" title="cppreference: cpp/language/list initialization, Revision as of 22:54, 26 August 2014">cppreference: cpp/language/list initialization</a>:</p>
  
  <blockquote>
  <pre><code>[...]
  
  T( { arg1, arg2, ... } )    (7)
  
  [...]
  </code></pre>
    
    <p>The effects of list initialization of an object of type T are:</p>
    
    <p>If <code>T</code> is an aggregate type, aggregate initialization is performed.</p>
    
    <p>Otherwise, If the braced-init-list is empty and <code>T</code> is a class type with a default constructor, value-initialization is performed.</p>
  
  <pre><code>[...]
  </code></pre>
  </blockquote>
  
  <p>I concluded that <code>Foo({})</code> should call the default constructor.</p>
  
  <p>Where's the bug?</p>