Ослабить требование, что элемент span-а должен иметь complete type
Собственно, идея в заголовке. Черновик (очень-очень сырой) proposal-а содержит мотивацию, так что просто повторю ее здесь. Сейчас (в C++20) такой естественный код не валиден:
class Element;
class Storage {
...
span<Element> get_elements();
};
extern void process(span<Element>);
void do_something(Storage& storage) {
process(storage.get_elements());
}
хотя с точки зрения здравого смысла span<Element> должен быть эквивалентен pair<Element*, size_t>, а значит фундаментальной причины, запрещать код выше, не существует.
При этом понятно, что для большинства методов span-а нужно чтобы ElementType был complete. Это не проблема, прецедент уже есть -- vector разрешает инстанцировать класс incomplete типом, но требует, чтобы тип элемента стал complete перед инстанциацией всех member-ов vector-а:
An incomplete type T may be used when instantiating vector if the allocator meets the allocator completeness requirements. T shall be complete before any member of the resulting specialization of vector is referenced.
Для span-а хочется ослабить требования до почти таких же, но copy/move-операции для span-а (они тривиальные) необходимо также разрешить даже когда тип элемента incomplete.
Идея очень хорошая, но просто удалить требование нельзя - многие методы span используют арифметику указателей.
@AndreyG в proposal вставьте те же волшебные слова что у vector https://eel.is/c++draft/vector#overview-4 и можно отправлять в комитет.
Идея очень хорошая, но просто удалить требование нельзя - многие методы span используют арифметику указателей.
Да, у меня об этом есть и в тексте issue и в черновике proposal-а.
@apolukhin куда именно Вы предлагаете вставить волшебные слова? Я колеблюсь между двумя вариантами.
- Вместо TODO написать diff wording-а для каждого из методов, добавляющий "Requirements:" или в "Preconditions:" "ElementType must be a complete object type that is not an abstract class type."
- Поменять views.span#span.overview-4 на "An incomplete type ElementType may be used when instantiating span. ElementType shall be a complete object type that is not an abstract class type before any member (except default constructor, trivial copy and move constructors and trivial copy and move assignment operators) of the resulting specialization of span is referenced."
Я бы для каждого метода прописал