B0r*_*rk4 3 c++ optional preconditions c++20
这个话题是有争议的,但是我相信,前提条件和类不变式应该由断言保护,如果违反了相应的SW组件的协定,则断言会终止程序-只要断言检查的运行时成本是不是性能瓶颈。
我真的很喜欢可选类型,并经常使用它们,但是对我而言,std :: optional的标准库实现目前不可用,因为首先对可选的取消引用不会执行检查其是否包含value,其次没有到目前为止,主要的c ++实现都在标准库函数中支持/实现断言。
从我多年来看到的std :: optional的使用中,我无法回忆起一个单个实例,其中std :: optional以这样的方式和数量使用,使得前提条件检查将成为性能瓶颈和令人望而却步。例如,我从未见过有人将遮罩图像实现为std:optional的数组。
我的问题:是否有提议(例如对于c ++ 22),它将合同功能添加到标准库中,特别是std :: optional?
是的,我知道异常会“保护” 值方法。首先,我不喜欢使用异常的非异常控制流(您是否曾经尝试调试过此类代码)。第二,我认为类型的强度和安全性应该通过其最弱的环节来判断。
我还不能发表评论,因此我在这里评论了Nicol Bolas的回答:
感谢您的回答,但坦率地说,我认为它不能回答我的问题。只是为了澄清。我不是在要求一项提议,要求对违反合同(“期望”关闭)的std :: abort进行调用。相反,我要问的是,在P0788提案之后,是否有任何计划将合同注释添加到标准库中。我同意该标准不应强制规定特定的实施方式应如何处理此类违约情况。
Nic*_*las 11
在不久的将来,这是有争议的,因为出于某些重做目的,合同已从C ++ 20中删除。但是,我认为其余内容仍然适用:
是否已经有提案(例如针对c ++ 22),该提案将合同支持的设计添加到标准库中,尤其是std :: optional?
恰恰相反:提案P0788被采纳并被折叠到C ++ 20工作文件中,该文件指出前提条件/后置条件不应由合同功能强制执行。P0788的特定目的是防止对使用合同进行这些事情(或类似条件的概念)的实施的正式要求:
让我们避免任何需要任何特定技术的规范,实现必须通过这些特定技术来符合库规范。
允许实现表达合同等条件,但并非必须如此。通过采用P0788,委员会正在有效地将此类问题视为实现质量的问题,而不是正式的规范。
C ++不是一种安全的语言,合同也无意这样做。违反合同是编程错误,并产生UB,这就是标准看待事物的方式。而且,通过设计,您无法将对安全的渴望强加于不想要安全的人。