Рассмотрим следующий фрагмент:
extern "C" {
#include "POD.h" // Defines struct POD;
}
template<class Base>
struct non_copyable : Base
{
non_copyable() {}
private:
non_copyable(non_copyable const&);
non_copyable& operator=(non_copyable const&);
};
class wrapper : non_copyable<POD>
{
typedef non_copyable<POD> _base_t;
public:
wrapper() : _base_t()
{}
};
Моя попытка - убедиться, что подобъект базового класса POD
инициализирован нулем во всех случаях в C ++ 03, C ++ 11 и C ++ 14 при создании локальных или временных объектов, переменных stati c, с помощью любого синтаксиса c новых выражений, et c. Кроме того, я хочу реализовать это максимально простым / кратчайшим способом.
Я считаю, что с инициализацией _base_t()
в списке инициализаторов wrapper
я закончил, но я не полностью уверен, если, поскольку non_copyable
имеет определяемый пользователем конструктор по умолчанию, если правила инициализации будут распространяться от wrapper
до POD
, и, следовательно, поскольку я не вызываю Base()
в non_copyable
явно список-инициализаторов, если он будет инициализирован нулем с помощью конструктора wrapper
стандартным образом.
Кроме того, я не могу использовать = default
для конструктора по умолчанию non-copyable
, поскольку wrapper
должен компилироваться в C++03
, поэтому пользовательский конструктор здесь обязателен.
Какие-то указания? Я немного смущен беспорядком правил инициализации (что реально: По умолчанию, беспорядок инициализации значений и нуля ).