title: const T{}; works, const T; fails when T is a non-POD,
body: <p>To start with, I have a struct with one value with a default value</p>
  
  <pre><code>struct S {
      int a = 1;
  };
  </code></pre>
  
  <p>This type can be default constructed when it is non-const / non-constexpr by both gcc and clang.  Under both, <code>std::is_pod&lt;S&gt;::value</code> is <code>false</code>.  The weird behavior is as follows:</p>
  
  <pre><code>S s1; // works under both
  const S s2{}; // works under both
  const S s3; // only works in gcc, clang wants a user-provided constructor
  </code></pre>
  
  <p>None of the following attempts makes a difference to clang:</p>
  
  <pre><code>struct S {
      int a = 1;
      constexpr S() = default; // defaulted ctor
      virtual void f() { } // virtual function, not an aggregate
    private:
      int b = 2; // private member, really not an aggregate
  };
  </code></pre>
  
  <p>The only thing I can do that makes this work is to add <code>constexpr S() { }</code> explicitly.  It seems really wrong to me that <code>const S s;</code> fails while <code>const S s{};</code> especially when the type is not an aggregate.</p>
  
  <p>The standard makes me think that Clang is right<br/>
  <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf" rel="nofollow noreferrer">N4296</a>: 8.5/7</p>
  
  <blockquote>
    <p>If a program calls for the default initialization of an object of a
    const-qualified type T, T shall be a class type with a user-provided
    default constructor</p>
  </blockquote>
  
  <p>So why does gcc allow this, and is <code>S{};</code> not default initializing, even when the type is not a POD or an aggregate?</p>