Какая (минимальная) черта / концепция может гарантировать правильную настройку объекта?
В соответствии со ссылкой std::memset
на cppreference поведение memset
в типе, отличном от TriviallyCopyable , не определено. Так что если все в порядке с memset
a TriviallyCopyable , тогда вы можете добавить static_assert
в свой класс, чтобы проверить это как
template<class T>
T zero_initialize()
{
static_assert(std::is_trivial_v<T>, "Error: T must be TriviallyCopyable");
T result;
std::memset(&result, 0, sizeof(result));
return result;
}
Здесь мы используем std::is_trivial_v
, чтобы удостовериться, что класс не только тривиально копируемый, но также имеет тривиальный конструктор по умолчанию, поэтому мы знаем, что инициализировать нулем безопасно.
Должен ли я использовать std::uninitialized_fill
вместо std::memset
? И почему?
Вам не нужно здесь, поскольку вы инициализируете только один объект.
Эта функция устарела одним из синтаксисов инициализации C ++ для подмножества типов? Или это будет с выходом будущих версий C ++?
Значение или ограниченная инициализация делают эту функцию "устаревшей". T()
и T{}
дадут вам инициализированное значение T
, а если T
не имеет конструктора по умолчанию, он будет инициализирован нулем. Это означает, что вы можете переписать функцию как
template<class T>
T zero_initialize()
{
static_assert(std::is_trivial_v<T>, "Error: T must be TriviallyCopyable");
return {};
}