Эта тема является спорной, но я нахожусь в лагере, который считает, что предварительные условия и инварианты классов должны быть защищены утверждениями, которые завершают программу, если нарушается контракт соответствующего компонента ПО - до тех пор, пока стоимость выполнения проверки утверждений составляет не является узким местом производительности.
Мне очень нравятся необязательные типы, и я часто их использую, но для меня стандартные библиотечные реализации std::Optional на данный момент непригодны для использования, так как сначала разыменование необязательного не выполняет проверки, содержит ли оно значение, и, во-вторых, ни одна из основных реализаций С++ не поддерживает/не реализует утверждения в стандартных библиотечных функциях, как сейчас.
Из использования std::Optional, которое я видел за эти годы, я не могу вспомнить ни одного случая, когда std::Optional использовался бы таким образом и в таком количестве, что проверки предварительных условий были бы узким местом производительности и непомерно высокими. Например, я никогда не видел, чтобы кто-то реализовал изображение маски в виде массива std:Optional.
Мой вопрос: есть ли уже какое-либо предложение (например, для С++ 22), которое добавляет функции контракта со стандартной библиотекой, в частности std::Optional?
Да, я знаю о методе value, который "защищен "в порядке исключения. Во-первых, я не большой поклонник неисключительного потока управления с использованием исключений (вы когда-нибудь пытались отлаживать такой код). Во-вторых, я считаю, что о силе и безопасности типа следует судить по его самому слабому звену.
Я пока не могу комментировать, поэтому я комментирую ответ Nicol Bolas здесь:
Спасибо за ответ, но, честно говоря, я не думаю, что он отвечает на мой вопрос. Просто для ясности. Я не прошу внести предложение, которое предписывает, чтобы std::abort вызывался при нарушении контракта (или "ожидаемом" закрытии). Вместо этого я спрашиваю, есть ли какие-либо планы по добавлению аннотаций к контрактам в стандартную библиотеку после предложения P0788. Я согласен с тем, что стандарт не должен предписывать, как конкретные реализации должны реагировать на такие нарушения контракта.
operator*
. Это привело бы к бессмысленному увеличению количества типов, в результате чего люди навязывали бы один способ поведения другим, выбирая тип, который использует механизм, который они предпочли бы использовать, и не давали бы получателю типа никакого права прибегать к использовать их предпочтительный инструмент (если есть). C++ не является безопасным языком. - person Nicol Bolas   schedule 14.07.2019expects
(переименованный вpre
) будет любой конкретной технологией, так что нет. Если вы спрашиваете, решил ли комитет по стандартам отменить решение, которое они только что приняли по этому поводу? Возможно нет. - person Nicol Bolas   schedule 15.07.2019