Предполагая, что ни один из членов класса не используется явно или неявно, пока тип не будет завершен:
Аргумент шаблона всегда может быть неполным для std::unique_ptr
и std::shared_ptr
начиная с C ++ 11, см. [unique.ptr] / 5 и [util.smartptr.shared] / 2 соответственно.
Поддержка неполных типов в контейнерах была добавлена с помощью N4510 до C ++ 17, но только для
std::vector
std::list
std::forward_list
и только в том случае, если используемый распределитель удовлетворяет требованиям полноты распределителя , а именно, что даже если сам тип значения не является полным, тип распределителя X
сам по себе является полным типом, как и все члены std::allocator_traits<X>
, кроме ::value_type
. Распределитель по умолчанию std::allocator
удовлетворяет этим требованиям.
Ни один из других контейнеров не может использоваться с неполными типами. Согласно предложению, связанному выше, область действия была ограничена этими тремя контейнерами " в качестве первого шага ", потому что основные реализации уже поддерживали его.