Подтвердить что ты не робот

Путаница в понимании стандартов С++

В С++ 98

12.6.2/4: после того, как вызов конструктора для класса X завершился, если член X не указан в инициализаторе памяти конструктора, ни инициализирован по умолчанию, ни инициализирован во время выполнения тела конструктора элемент имеет неопределенное значение.

Что означает инициализация во время выполнения тела конструктора? Может ли элемент быть инициализирован внутри тела конструктора?

4b9b3361

Ответ 1

и не инициализировано во время выполнения тела конструктора неверно IMHO.

Условные обозначения были изменены в С++ 03 и не инициализированы (в С++ 98) так и не заданы значение

После того, как вызов конструктора для класса X завершился, если член X не указан в конструкторах mem-инициализаторов конструктора, ни инициализирован по умолчанию, ни инициализирован по значению, и не задан значение во время выполнения тела конструктора, член имеет неопределенное значение.

Ответ 2

На самом деле это очень просто. члены класса/структуры могут включать объекты с конструкторами по умолчанию, но если они этого не делают, и вы не удосуживаетесь дать им значение в списке инициализации и не устанавливать их внутри тела конструктора, то в основном память, которую они занимать - все, что было наложено для них из стека или кучи - все равно будет иметь старый мусор там, то есть неопределенное значение.

Рассмотрим:

struct X
{
    X() : x1(1) { x2 = 2; }
    double x1, x2, x3;
    std::string x4;
};

Здесь x1 и x2 явно инициализируются конструктором X, а x4 - будучи std::string - по умолчанию построено как ""/length 0. x3, однако, может быть чем угодно - и его не следует читать до тех пор, пока он не будет установлен (это поведение undefined и действительно может укусить на некоторых системах), считайте, что битовая палитра памяти, которую он занимает, может даже не быть допустимым значением для double, поэтому чтение из него может вызвать некоторое исключение процессора/прерывание/прерывание).