Почему инициализация в фигурных скобках C ++ 11 в списке инициализации конструктора не работает, когда инициализация parens выполняется?

Чем инициализация {} в списке инициализации конструктора отличается от инициализации () при инициализации ссылки на абстрактные типы? Возьмите класс Bar ниже:

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& base) : myBase{base} {}

private:
    const AbstractBase& myBase;
};


int main()
{
    Foo f{};
    Bar b{f};

}

При компиляции я получаю ошибку

test5.cpp: In constructor ‘Bar::Bar(const AbstractBase&)’:
test5.cpp:22:48: error: cannot allocate an object of abstract type ‘AbstractBase’
     Bar(const AbstractBase& 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;

Изменение линии

Bar(const AbstractBase& base) : myBase(base) {}

он компилируется и работает нормально.

Читая книгу Страуструпа по C ++ 11, у меня сложилось впечатление, что {} был таким же, как () в большинстве всех случаев, за исключением случаев, когда между конструкторами, которые принимают std :: initializer_list <> и другими конструкторами, и случаями была неоднозначность где с использованием auto в качестве типа, ни один из которых я не делаю здесь.

Ответы на вопрос(1)

Ваш ответ на вопрос