LINUX.ORG.RU

История изменений

Исправление 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. Видеть контракт функции в сигнатуре иногда полезнее, чем в документации.