1) Инстациации с разными типами шаблона класса могут быть совершенно разными по интерфейсу и модели памяти (std::vector<bool> vs std::vector<T> как пример).
2) Ковариантность и контрвариантность потребует либо встроенного type erasure (как дженерики в джаве), либо иммутабельности контейнеров, т.к. иное может ломать систему типов при попытке всунуть в контейнер, инстациированный для одного наследника, объекты другого наследника.
@4da 2. Нужна иммутабельность, прикреплённая к типу, first-class, если удобно.
1. Таким, что специализация шаблона может быть абсолютно произвольной.
Предположим, что есть cont<Base> cnt = cont<Derived>, а cont<Derived> специализирован так, что не имеет полей-стораджей вообще, а вычисляет данные по запросу (тупой вариант, но понятный последствиями), так вот положив в cnt ещё какой-нибудь Derived2, у тебя уже получается коллапс системы типов.
@dzhon Короче, если коротко и простыми словами общо, то C++ и язык шаблонов C++ -- две разные самостоятельные сущности и оба с Тьюринг-полнотой.
Ковариантность относится к первому языку, а параметризованные типы-контейнеры ко второму; при этом у этих языков полностью отличается система типов (второй чисто функциональный, а первый мультипарадигменный).
ответил в раковне чтобы унизить сноба дедфуда
@dzhon 1. каким местом тут модель роляет, если считать Base и Derived ковариантными?
2. иммутабельные контейнеры никто не додумался еще сделать чтоль?
@dzhon я чот не догоняю: если Base имеет поля-стораджи, то при открытом наследовании они у Derived тоже будут.
@dzhon * открытые поля-стораджи.
если они закрытые, то о чем разговор вообще?
@dzhon у тебя контейнер скоупом чтоли параметризируется? как в одном контейнере могут быть разные поля?