Здравствуйте, rg45, Вы писали:
R>Здравствуйте, vopl, Вы писали:
R>>>Вот если бы ещё получить ссылку на соответствующий пункт стандарта, было бы совсем здорово.
V>>https://timsong-cpp.github.io/cppwp/class.mem.general#note-4
R>А как тогда объяснить это:
R>https://godbolt.org/z/oPo3o5ME7
R>R>struct D
R>{
R> struct FService
R> {
R> int nFService_ = 0;
R> };
R> static_assert(sizeof(FService) != 0); // OK
// не является complete-class context так как не является ни одним из перечисленных вариантов в 10.1 - 10.6 отсюда https://timsong-cpp.github.io/cppwp/class.mem.general#10
R> static_assert(std::default_initializable<FService>); // static assertion failed
// тут complete-class context это инициализирующее выражение "0" для FService::nFService_ (https://timsong-cpp.github.io/cppwp/class.mem.general#10.6), размещенное "within the member-specification", коим является static_assert (https://timsong-cpp.github.io/cppwp/class.mem.general#nt:member-declaration)
// этот complete-class context провоцирует дефолтный конструктор FService к удалению, тест default_initializable проваливается, получаем ложь и провал static_assert
R>};
R>
R>Выходит, класс "достаточно полный" для sizeof, но недостаточно полный для того, чтобы понять, что он default infitializable. Это как так?