Да B не является агрегатным типом , который не может иметь виртуальных функций-членов. Таким образом, B b = {3}; не будет выполнять агрегатную инициализацию , но вместо этого copy-list-initialization (начиная с C ++ 11) , в качестве эффекта вызывается конструктор B::B(int) для инициализировать объект.
B
B b = {3};
B::B(int)
В противном случае конструкторы T рассматриваются в два этапа: ... Если предыдущий этап не приводит к совпадению, все конструкторы T участвуют в разрешении перегрузки против набора аргументов, который состоит из элементов в фигурных скобках -init-list с ограничением, что разрешены только несужающие преобразования. Если на этом этапе создается явный конструктор как наиболее подходящий для инициализации списка копирования, компиляция завершается неудачно (обратите внимание, что при простой инициализации копирования явные конструкторы вообще не рассматриваются). *
В противном случае конструкторы T рассматриваются в два этапа:
T
...
Если предыдущий этап не приводит к совпадению, все конструкторы T участвуют в разрешении перегрузки против набора аргументов, который состоит из элементов в фигурных скобках -init-list с ограничением, что разрешены только несужающие преобразования. Если на этом этапе создается явный конструктор как наиболее подходящий для инициализации списка копирования, компиляция завершается неудачно (обратите внимание, что при простой инициализации копирования явные конструкторы вообще не рассматриваются). *