Почему в std::expected нет монадических операций?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему в std::expected нет монадических операций?

Сообщение Anonymous »

Я смоделировал функцию, которая возвращает экземпляр std::expected. Я сказал себе: «Я могу использовать новый стандарт, поэтому я спроектирую свою библиотеку соответствующим образом» — и я был очень позитивно иметь хорошую и конкретную обработку ошибок. Теперь оказывается, что все монадические операции над std::expected работают только с непустыми элементами. Несмотря на то, что существует специализация для void, монадические операции недоступны.
Я понимаю, что or_else должен возвращать значение, но есть специализация для void, поэтому почему это не должно работать?

Код: Выделить всё

std::expected fun (int);

fun (19).and_then ([]() { doSomething(); }).or_else ([] (Error e) { std::println ("Uh oh error.."); });
Это дает:

Код: Выделить всё

/usr/include/c++/14.2.1/expected:1586:37: error: static assertion failed
1586 |           static_assert(__expected::__is_expected);
|                         ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/usr/include/c++/14.2.1/expected:1586:37: note: ‘std::__expected::__is_expected’ evaluates to false
/usr/include/c++/14.2.1/expected:1587:25: error: ‘std::remove_cvref::type’ {aka ‘void’} is not a class, struct, or union type
1587 |           static_assert(is_same_v);
|                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14.2.1/expected:1592:20: error: expression list treated as compound expression in functional cast [-fpermissive]
1592 |             return _Up(unexpect, std::move(_M_unex));
|                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/david/tests/cpp/src/expect.cpp: In function ‘int main()’:
/home/david/tests/cpp/src/expect.cpp:49:26: error: invalid use of ‘void’
В чем здесь проблема? Эта функция реализована только наполовину (поэтому стандарт неполный) или я неправильно понимаю ее смысл?

Подробнее здесь: https://stackoverflow.com/questions/792 ... void-error
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»