Ответ 1
Это ошибка компилятора в g++.
В разделе С++ 14 (N4140) [dcl.init.list] определение инициализации списка (отредактировано для краткости):
Список-инициализация объекта или ссылки типа
T
определяется следующим образом:
- Если
T
является агрегатом, выполняется агрегатная инициализация- В противном случае, если в списке инициализаторов нет элементов, а
T
- это тип класса со стандартным конструктором, объект инициализируется значением.- В противном случае, если
T
является специализацией std:: initializer_list, [...]- В противном случае, если
T
- тип класса, рассматриваются конструкторы. Соответствующие конструкторы перечислены, и лучший выбирается с помощью разрешения перегрузки. Если для преобразования любого из аргументов требуется сужение преобразования, программа плохо сформирована.- [...]
Первые 3 точки не применяются: B
не является агрегатом (агрегат не может иметь базовые классы), в списке инициализаторов есть элементы, B
не является специализацией std::initializer_list
.
Четвертая точка применяется, потому что разрешение перегрузки соответствует B{p_value1, p_value2}
конструктору B(int, int)
в соответствии с [over.match.list]/1.2:
Если не существует жизнеспособного конструктора-списка инициализаторов, разрешение перегрузки выполняется снова, где кандидатные функции являются всеми конструкторами класса
T
, а список аргументов состоит из элементов списка инициализаторов.
Из последней цитаты следует, что B(whatever)
и B{whatever}
должны вести себя одинаково.