Сообщение Zero initialization от 05.09.2021 11:56
Изменено 05.09.2021 11:57 Videoman
Zero initialization
Возьмем какой-нибудь POD тип T для которого явно не запрещен, но и не определен конструктор по умолчанию. Тогда в объявлении мы можем либо инициализировать тип нулями, либо нет:
Как быть в таком случае и обеспечить однообразное обобщенное поведение ? По идее, в шаблонном методе можно написать что-то типа: type_t a(0), но тогда все типы должны будут иметь конструктор который принимает 0. Вопрос к знатокам, как правильно разрулить такую ситуацию?
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 для которого явно не запрещен, но и не определен конструктор по умолчанию. Тогда в объявлении мы можем либо инициализировать тип нулями, либо нет:
Как быть в таком случае и обеспечить однообразное обобщенное поведение ? По идее, в шаблонном методе можно написать что-то типа: type_t a(0), но тогда все типы должны будут иметь конструктор который принимает 0. Вопрос к знатокам, как правильно разрулить такую ситуацию?
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. Вопрос к знатокам, как правильно разрулить такую ситуацию?