cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
88 stars 0 forks source link

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

Open AndreyG opened 2 years ago

AndreyG commented 2 years ago

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

apolukhin commented 1 year ago

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

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

AndreyG commented 1 year ago

Идея очень хорошая, но просто удалить требование нельзя - многие методы 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."
apolukhin commented 11 months ago

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