Информация об изменениях

Сообщение Zero initialization от 05.09.2021 11:56

Изменено 05.09.2021 11:57 Videoman

Zero initialization
Возьмем какой-нибудь POD тип T для которого явно не запрещен, но и не определен конструктор по умолчанию. Тогда в объявлении мы можем либо инициализировать тип нулями, либо нет:
T a;    // Нет никакой инициализации
T a();  // Инициализируем нулями
T a{};  // Инициализируем нулями
Теперь допустим, что я хочу определить конструкторы, в том числе и конструктор по умолчанию, но который не должен инициализировать члены класса T, например:
class T
{
    T() {}
    T(const T& that) = default;
    T(T&& that) noexcept = default;
    // ...
}
Теперь если смотреть на все это в контексте какого-нибудь шаблонно метода, то как я понимаю мы не можем обеспечить такое-же поведение по умолчанию:
template <typename type_t>
type_t func()
{
    type_t a;   // Тут не происходит инициализации и в случае любого другого POD и в случае T
    type_t b(); // А вот тут в случае POD происходит инициализация нулями, а в случае T её нет ???
}

Как быть в таком случае и обеспечить однообразное обобщенное поведение ? По идее, в шаблонном методе можно написать что-то типа: type_t a(0), но тогда все типы должны будут иметь конструктор который принимает 0. Вопрос к знатокам, как правильно разрулить такую ситуацию?
Zero initialization
Возьмем какой-нибудь POD тип T для которого явно не запрещен, но и не определен конструктор по умолчанию. Тогда в объявлении мы можем либо инициализировать тип нулями, либо нет:
T a;    // Нет никакой инициализации
T a();  // Инициализируем нулями
T a{};  // Инициализируем нулями
Теперь допустим, что я хочу определить конструкторы, в том числе и конструктор по умолчанию, но который не должен инициализировать члены класса T, например:
class T
{
    T() {}
    T(const T& that) = default;
    T(T&& that) noexcept = default;
    // ...
}
Теперь если смотреть на все это в контексте какого-нибудь шаблонно метода, то как я понимаю, мы не можем обеспечить такое-же поведение по умолчанию:
template <typename type_t>
type_t func()
{
    type_t a;   // Тут не происходит инициализации и в случае любого другого POD и в случае T
    type_t b(); // А вот тут в случае POD происходит инициализация нулями, а в случае T её нет ???
}

Как быть в таком случае и обеспечить однообразное обобщенное поведение ? По идее, в шаблонном методе можно написать что-то типа: type_t a(0), но тогда все типы должны будут иметь конструктор который принимает 0. Вопрос к знатокам, как правильно разрулить такую ситуацию?