Спасибо за разъяснения в комментариях;
Поскольку C ++ 17, B{}
является агрегатным, даже если он получен из A
, поэтому для агрегатного инициатора будет создан временный A
пользователем, который не имеет доступа к dtor
. Таким образом, Clang правильно отклонить компиляцию. Стандарт:
нет виртуальных, частных или защищенных (начиная с C ++ 17) базовых классов
Однако использование ()
будет работать, как говорит стандарт.
dtor
базы может быть общедоступным или защищенным.
Общим правилом является то, что деструктор для базового класса должен быть
общедоступные и виртуальные или защищенные и не виртуальные
см. Руководство стандарта
В отличие от C ++ 11, где выражение B()
- это prvalue
, а auto b = B();
- конструкция-ход, и движение, скорее всего, будет исключено. В C ++ 17 нет движения , prvalue
не перемещен из. Это инициализирующее значение B()
и в точности эквивалентное:
B();
Значения категорий в C ++ 17
Если этот код не скомпилируется в C ++ 17?