История изменений
Исправление red75prim, (текущая версия) :
Нет конечно. Без исключений нет никакой возможности вернуть ошибку из конструктора
Без исключений нет возможности вернуть ошибку из конструкторов C++. Вернуть ошибку из замыкания - без проблем.
Нет, он не предлагает никаких средств для решения такой задачи.
Какой именно задачи? Сделать перегрузку как в С++? Это не задача, а способ решения некоторых задач, выбранный в C++.
вызываемому же коду придется осуществлять дополнительную проверку на ошибки
Если замыкание возвращает Result<T, !>
, то обработка ошибок будет выброшена. Да и «дополнительная проверка на ошибки» вполне может быть оптимизирована так, как это делается для исключений - с использованием side tables. Технически это сложнее из-за того, что обработку ошибок контролирует программист, но гарантировать генерацию side tables при использовании стандартного способа обработки с помощью ?
вполне возможно.
задача же конструирования произвольного T все еще не решена. Тем более in-place.
Что значит не решена? Замыкание, реализующее Fn()->T
, именно это и делает. in-place конструирование предполагается решить с помощью гарантированного copy-elision. Это проще чем в C++ из-за move семантики без сайд-эффектов.
Когда в дело включается Pin, все становится еще интереснее.
Не становится. Сам тип Pin<PtrT>
- перемещаемый. Он просто предоставляет интерфейс для доступа к неперемещаемым значениям типа T, лежащим за указателем PtrT.
Кстати, реализовать все сразу я не смогу – Bar::new мономорфен по ссылке.
Зависит от сигнатуры. fn new<T: Into<Foo>>(_: T) -> Bar
может принимать и ссылки (если реализовать From<&Foo> for Foo)
в расте очень много где используется
Result<T, Box<dyn Error>>
В библиотеках обычно используются конкретные типы ошибок. Ошибки со стёртым типом чаще встречаются в приложениях, когда выяснили, что сделать уже ничего не можем и остаётся пробросить ошибку выше (для логирования и т.п.). В этом случае «ручная раскрутка стека» сводится к добавлению ?
.
unwrap’ы - это не такой уж и частый случай за пределами hello world’ов. Да, бывает, что выразить что-то на уровне типов нельзя (как в моём примере с conditional-move выше) или сложно. Например, у меня около 250 unwrap’ов на 60000 строк кода и из них штук 100 в тестах.
«грязный» интерфейс
For whom how. Видеть контракт функции в сигнатуре иногда полезнее, чем в документации.
Исходная версия red75prim, :
Нет конечно. Без исключений нет никакой возможности вернуть ошибку из конструктора
Без исключений нет возможности вернуть ошибку из конструкторов C++. Вернуть ошибку из замыкания - без проблем.
Нет, он не предлагает никаких средств для решения такой задачи.
Какой именно задачи? Сделать перегрузку как в С++? Это не задача, а способ решения некоторых задач, выбранный в C++.
вызываемому же коду придется осуществлять дополнительную проверку на ошибки
Если замыкание возвращает Result<T, !>
, то обработка ошибок будет выброшена. Да и «дополнительная проверка на ошибки» вполне может быть оптимизирована так, как это делается для исключений - с использованием side tables. Технически это сложнее из-за того, что обработку ошибок контролирует программист, но гарантировать генерацию side tables при использовании стандартного способа обработки с помощью ?
вполне возможно.
задача же конструирования произвольного T все еще не решена. Тем более in-place.
Что значит не решена? Замыкание, реализующее Fn()->T
, именно это и делает. in-place конструирование предполагается решить с помощью гарантированного copy-elision. Это проще чем в C++ из-за move семантики без сайд-эффектов.
Когда в дело включается Pin, все становится еще интереснее.
Не становится. Сам тип Pin - перемещаемый. Он просто предоставляет интерфейс для доступа к неперемещаемым значениям типа T, лежащим за указателем PtrT.
Кстати, реализовать все сразу я не смогу – Bar::new мономорфен по ссылке.
Зависит от сигнатуры. fn new<T: Into<Foo>>(_: T) -> Bar
может принимать и ссылки (если реализовать From<&Foo> for Foo)
в расте очень много где используется Result<T, Box>
В библиотеках обычно используются конкретные типы ошибок. Ошибки со стёртым типом чаще встречаются в приложениях, когда выяснили, что сделать уже ничего не можем и остаётся пробросить ошибку выше (для логирования и т.п.). В этом случае «ручная раскрутка стека» сводится к добавлению ?
.
unwrap’ы - это не такой уж и частый случай за пределами hello world’ов. Да, бывает, что выразить что-то на уровне типов нельзя (как в моём примере с conditional-move выше) или сложно. Например, у меня около 250 unwrap’ов на 60000 строк кода и из них штук 100 в тестах.
«грязный» интерфейс
For whom how. Видеть контракт функции в сигнатуре иногда полезнее, чем в документации.