title: Why doesn't C++11 curly brace initialzation in constructor initialization list work when parens initializaton does?
body: <p>How is {} initialization in a constructor initialization list different from () initialization when initializing reference to abstract types?  Take class Bar below:</p>
  
  <pre><code>class AbstractBase
  {
  public:
      AbstractBase() {}
      virtual ~AbstractBase() = default;
  
      virtual void ab() = 0;
  };
  
  class Foo : public AbstractBase
  {
  public:
      Foo() {}
  
      void ab() {}
  };
  
  class Bar
  {
  public:
      Bar(const AbstractBase&amp; base) : myBase{base} {}
  
  private:
      const AbstractBase&amp; myBase;
  };
  
  
  int main()
  {
      Foo f{};
      Bar b{f};
  
  }
  </code></pre>
  
  <p>When compiling, I get the error</p>
  
  <pre><code>test5.cpp: In constructor ‘Bar::Bar(const AbstractBase&amp;)’:
  test5.cpp:22:48: error: cannot allocate an object of abstract type ‘AbstractBase’
       Bar(const AbstractBase&amp; base) : myBase{base}
                                                  ^
  test5.cpp:2:7: note:   because the following virtual functions are pure within ‘AbstractBase’:
   class AbstractBase
         ^
  test5.cpp:8:18: note:   virtual void AbstractBase::ab()
       virtual void ab() = 0;
  </code></pre>
  
  <p>Changing the line</p>
  
  <pre><code>Bar(const AbstractBase&amp; base) : myBase(base) {}
  </code></pre>
  
  <p>it compiles and runs fine.</p>
  
  <p>Reading through Stroustrup's C++11 book, I was under the impression that {} was the same as () in most all cases, except where there was an ambiguity between constructors that take std::initializer_list&lt;> and other constructors, and cases where using auto as the type, neither of which I'm doing here.</p>