Запрет на произвольный порядок записи инициализаторов в списках инициализации в конструкторах.

Никита Колотов
Никита Колотов

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

15.6.2 [class.base.init] 13 In a non-delegating constructor, initialization proceeds in the following order:
(13.1) First, and only for the constructor of the most derived class (6.6.2), virtual base classes are initialized in the order they appear on a depth-first left-to-right traversal of the directed acyclic graph of base classes, where “left-to-right” is the order of appearance of the base classes in the derived class base-specifier-list.
(13.2) Then, direct base classes are initialized in declaration order as they appear in the base-specifier-list
(regardless of the order of the mem-initializers).
(13.3) Then, non-static data members are initialized in the order they were declared in the class definition
(again regardless of the order of the mem-initializers).

На практике это может приводить ко следующим проблемам:

1. Неопределенное Поведение непосредственно из-за использования неинициализированных полей:

struct foo
{
    foo(void)
    : frob{42}
    , zig{frob * 2} // frob is uninitialized at this point
    {}

    int zig;
    int frob;
};

2. промахи с порядком вызова функций с побочными эффектами, используемых при инициализации:

int first(void);
int second(void);

struct foo
{
    foo(void)
    : frob{first()}
    , zig{second()} // second is called prior to first
    {}

    int zig;
    int frob;
};

В современных компиляторах уже достаточно давно реализованы диагностические сообщения на такой случай (-Wreorder). Соответственно я предлагаю добавить в стандарт требование однозначного соответствия следования инициализаторов в списке инициализации реальному порядку их вызова.

5
рейтинг
Нет комментариев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения