Нулевая инициализация косвенного базового класса "POD" через базовый класс "не-POD" - PullRequest
1 голос
/ 08 мая 2020

Рассмотрим следующий фрагмент:

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, поэтому пользовательский конструктор здесь обязателен.

Какие-то указания? Я немного смущен беспорядком правил инициализации (что реально: По умолчанию, беспорядок инициализации значений и нуля ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...