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

Сообщение Re[9]: std::variant для вложенного класса от 04.12.2025 15:23

Изменено 04.12.2025 15:30 rg45

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

R>>
R>>struct D
R>>{
R>>    struct FService
R>>    {
R>>        int  nFService_ = 0;
R>>    };
R>>    static_assert(sizeof(FService) != 0);  // OK
V>// не является complete-class context так как не является ни одним из перечисленных вариантов в 10.1 - 10.6 отсюда https://timsong-cpp.github.io/cppwp/class.mem.general#10

R>>    static_assert(std::default_initializable<FService>); // static assertion failed
V>// тут complete-class context это инициализирующее выражение "0" для FService::nFService_ (https://timsong-cpp.github.io/cppwp/class.mem.general#10.6), размещенное "within the member-specification", коим является static_assert (https://timsong-cpp.github.io/cppwp/class.mem.general#nt:member-declaration)
V>// этот complete-class context провоцирует дефолтный конструктор FService к удалению, тест default_initializable проваливается, получаем ложь и провал static_assert
R>>};
R>>


Примерно понял, спасибо. Почитаю ещё документ повнимательнее.

PS. Хотя логика этих зависимостей мне не очень понятна. Получается, что в обрамляющем классе можно написать нечто такое, отчего вложенный класс не сможет быть default initializable.
Re[9]: std::variant для вложенного класса
Здравствуйте, vopl, Вы писали:

R>>
R>>struct D
R>>{
R>>    struct FService
R>>    {
R>>        int  nFService_ = 0;
R>>    };
R>>    static_assert(sizeof(FService) != 0);  // OK
V>// не является complete-class context так как не является ни одним из перечисленных вариантов в 10.1 - 10.6 отсюда https://timsong-cpp.github.io/cppwp/class.mem.general#10

R>>    static_assert(std::default_initializable<FService>); // static assertion failed
V>// тут complete-class context это инициализирующее выражение "0" для FService::nFService_ (https://timsong-cpp.github.io/cppwp/class.mem.general#10.6), размещенное "within the member-specification", коим является static_assert (https://timsong-cpp.github.io/cppwp/class.mem.general#nt:member-declaration)
V>// этот complete-class context провоцирует дефолтный конструктор FService к удалению, тест default_initializable проваливается, получаем ложь и провал static_assert
R>>};
R>>


Примерно понял, спасибо. Почитаю ещё документ повнимательнее.

PS. Хотя логика этих зависимостей мне не очень понятна. Получается, что в обрамляющем классе можно написать нечто такое, отчего вложенный класс не сможет быть default initializable. В противном случае зачем эти сложности.