Здравствуйте, x-code, Вы писали:
XC>Понятно что некоторые типы могут порождать объекты динамического размера. В С++ хотя-бы std::vector и std::list. Но это и так понятно и придумано уже давно.
XC>А здесь что?
std::vector и std::list — структуры постоянного размера (и известного при компиляции), содержащие указатели на память в куче.
Вот получаешь ты в функцию адрес чего-то. И хочешь это что-то скопировать по значению. Для этого надо знать как минимум, сколько байт копировать. Если это примитивный тип или тупл/структура, то размер компилятору известен статически, все ок. std::vector и std::list как раз такие.
А вот если это что-то описано как объект некоторого класса, и этот класс служит базовым для некоторых других, то возможно, что вместо объекта базового класса там окажется объект наследного, он может быть уже другого размера. Что там на самом деле — известно лишь в рантайме, вот и получается тип динамического размера. Если копировать, полагаясь на известный при компиляции тип, то объект может быть скопирован не целиком, получается слайсинг, беда. Поэтому в цивизизованных ОО языках все объекты размерщают в куче и передают лишь по указателю, по значению их не копируют.
Аналогично и тут, только вместо базового класса trait, который служит аналогом интерфейса. Если известен лишь интерфейс/trait, то размер объекта, который его реализует, неизвестен статически, он динамический.