Тривиальная инициализация по умолчанию была запрещена в constexpr
контексте до C ++ 20 .
Причина, я предполагаю, заключается в том, что это простое «случайное» чтение из инициализированных по умолчанию примитивов, действие, придающее вашей программе неопределенное поведение, и выражения с неопределенным поведением, прямо запрещено constexpr
( ref ). Язык был расширен, так что теперь компилятор должен проверить, происходит ли такое чтение, и, если это не так, должна быть принята инициализация по умолчанию. Это немного больше работы для компилятора, но (как вы видели!) Имеет существенные преимущества для программиста.
В этой статье предлагается разрешить инициализацию по умолчанию для тривиально конструируемых типов по умолчанию в контекстах constexpr при продолжении запретить вызов неопределенного поведения. Короче говоря, до тех пор, пока неинициализированные значения не читаются, такие состояния должны быть разрешены в constexpr как в сценарии, выделенном для кучи, так и для стека ios.
Начиная с C ++ 20, законно выходить v_
"неинициализирован", как у вас. Затем вы перешли к присвоению значений всех его элементов, и это здорово.