Информация об изменениях

Сообщение Re[11]: std::variant для вложенного класса от 05.12.2025 17:55

Изменено 05.12.2025 18:08 rg45

Re[11]: std::variant для вложенного класса
Здравствуйте, sergii.p, Вы писали:

SP>
SP>static constexpr int SuperDuperConst = 0;

SP>struct Outer {
SP>    struct Inner {
SP>        int i = SuperDuperConst;
SP>    };
SP>    std::variant<Inner> v; // i должна быть равна 42, но мы ещё не добрались до определения SuperDuperConst и конструктор сгенерировать не можем - компиляция провалилась
SP>    static constexpr int SuperDuperConst = 42;
SP>};
SP>


Что-то ты перемудрил. При чём тут добрались или не добрались. Твои SuperDuperConst вообще никакого рояля не играют. Ты можешь переносить их как угодно ДО и как угодно ПОСЛЕ, а можешь удалить их все, а инициализатор заменить литеральным нулём и проблема останется ровно та же самая.

PS. Имхо, напрасно вы вернулись к использованию variant, по-моему, он вас только путает. static_assert(std::default_initializable<Inner>) — вот и всё что нужно.
Re[11]: std::variant для вложенного класса
Здравствуйте, sergii.p, Вы писали:

SP>
SP>static constexpr int SuperDuperConst = 0;

SP>struct Outer {
SP>    struct Inner {
SP>        int i = SuperDuperConst;
SP>    };
SP>    std::variant<Inner> v; // i должна быть равна 42, но мы ещё не добрались до определения SuperDuperConst и конструктор сгенерировать не можем - компиляция провалилась
SP>    static constexpr int SuperDuperConst = 42;
SP>};
SP>


Что-то ты перемудрил. А когда вместо SuperDuperConst используется литеральный ноль в качестве инициализатора, куда мы в этом случае ещё не добрались?