cpp-ru / ideas

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

Контракты для корутин #278

Open Neargye opened 3 years ago

Neargye commented 3 years ago

Перенос предложения: голоса +5, -0 Автор идеи: Олег Власов

Хочется что бы можно было использовать контракты в корутинах. Также как с функциями:

task<> tcp_echo_server(socket socket)
[[expects: socket.is_open()]]
 {
  char data[1024];
  for (;;) {
    size_t n = co_await socket.async_read_some(buffer(data));
    co_await async_write(socket, buffer(data, n));
  }
}

Потому что, это даст возможность сообщать разработчику об ограничения работы с данной корутиной. И позволит компилятору оптимизорать работу с ней.

Neargye commented 3 years ago

yndx-antoshkka 10 апреля 2019, 22:26 Спрошу в рассылках, кажется что проблема не обсуждалась.

Andrey Davydov 10 апреля 2019, 23:01 А что мешает этому в текущей версии стандарта? Корутины это обычные функции.

yndx-antoshkka 10 апреля 2019, 23:10 Andrey Davydov, лично мне не очень понятно:

Надо почитать стандарт.

Andrey Davydov 11 апреля 2019, 0:10 yndx-antoshkka, в стандарте очень мало что специфицировано про контракты: http://eel.is/c++draft/dcl.attr.contract. Кажется, что для проверки предъусловия тело функции вообще не нужно, т.е. эти проверки можно вставлять в место вызова, где даже не известно, что вызываемая функция является корутиной.

Andrey Davydov 11 апреля 2019, 0:20 Поэтому для меня очевидно, что predondition должно проверяться в момент создания корутины, а не в момент первого пробуждения. Скажем корутина пораждаящая генератор не будет пробуждена, если никто не запросит значение из генератора, но это же не значит, что можно нарушать контракт передавая ей на вход любые значения.

А вот с postcondition-м ситуация, действительно, интереснее, так как фраза "A postcondition is checked by evaluating its predicate immediately before returning control to the caller of the function." (http://eel.is/c++draft/dcl.attr.contract#cond-5) с корутинами явно не очень сочетается.

yndx-antoshkka 31 июля 2019, 13:26 Контракты отложены, в C++20 их не будет.