ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Ослабить требование, что элемент span-а должен иметь complete type

Open AndreyG opened this issue 4 years ago • 3 comments

Собственно, идея в заголовке. Черновик (очень-очень сырой) 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.

AndreyG avatar Dec 08 '21 10:12 AndreyG

Идея очень хорошая, но просто удалить требование нельзя - многие методы span используют арифметику указателей.

@AndreyG в proposal вставьте те же волшебные слова что у vector https://eel.is/c++draft/vector#overview-4 и можно отправлять в комитет.

apolukhin avatar Feb 23 '23 16:02 apolukhin

Идея очень хорошая, но просто удалить требование нельзя - многие методы span используют арифметику указателей.

Да, у меня об этом есть и в тексте issue и в черновике proposal-а.

@apolukhin куда именно Вы предлагаете вставить волшебные слова? Я колеблюсь между двумя вариантами.

  1. Вместо TODO написать diff wording-а для каждого из методов, добавляющий "Requirements:" или в "Preconditions:" "ElementType must be a complete object type that is not an abstract class type."
  2. Поменять 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."

AndreyG avatar Feb 23 '23 16:02 AndreyG

Я бы для каждого метода прописал

apolukhin avatar Oct 22 '23 09:10 apolukhin