Я смотрел на очень похожий вопрос, но я не совсем уверен, что понимаю ответ. Если я делегирую конструктор, какие инициализации из списков инициализации происходят?
Пример:
MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL),
int1(a),
int2(b),
pOtherClass(NULL)
{
}
MyClass::MyClass(int a, int b, Other *p)
:
int1(a),
int2(b),
pOtherClass(p)
{
if (pOtherClass == NULL)
{
pOtherClass = &DefaultInstance;
}
}
Здесь я должен иметь полные списки инициализаторов для обоих классов из-за настроек компилятора. Но что я не хочу это:
int, int
) вызывает второй конструктор (int, int, Other *
)pOtherClass
pOtherClass
в NULL
,Вопрос, который я связал сверху, кажется, показывает, что такое поведение привычка происходят, но тогда какой смысл список инициализатора в (int, int
) конструктор? Просто чтобы компилятор был доволен?
Согласно стандарту C ++
Если mem-initializer-id обозначает класс конструктора, это должно быть
единственный mem-инициализатор; конструктор является делегирующим конструктором,
и конструктор, выбранный mem-initializer, является целью
конструктор. Главный конструктор — первый конструктор
вызывается при построении объекта (то есть не цели
конструктор для строительства этого объекта). Целевой конструктор
выбрано разрешением перегрузки. Как только целевой конструктор вернется,
тело делегирующего конструктора выполняется. Если конструктор
делегирует себе прямо или косвенно, программа плохо сформирована;
Диагностика не требуется.
Так что это определение конструктора
MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL),
int1(a),
int2(b),
pOtherClass(NULL)
{
}
является недействительным.
Должно быть
MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL)
{
}
Других решений пока нет …