MSVC里面有SAL feature,可以用来描述参数,结果等,效果很好,可移植性也不错,C++2a的Contract特性好像也一样,能不能给点diff它们之间?

最佳答案

SAL 和契约(Contract)之间没有真正的重叠。 SAL 是关于注释参数和返回值,以描述函数如何使用它们的某些方面。关于描述函数对其参数的要求以及调用者对返回值的期望的契约(Contract)。这些听起来很相似,但它们非常不同。

例如,SAL 具有参数是输入、输出还是输入/输出参数的概念。这是函数如何处理参数的问题。合约没有这样的概念,因为它们不关心函数对参数做了什么。

现在有一些重叠。有时,函数所期望的和函数确实对齐。例如,如果一个函数期望一个指针参数不是 nullptr ,你可以将一个 [[pre: param != nullptr]] 契约应用于该函数。然而,_In_ 指针参数注释的 SAL 概念涵盖了相同的一般思想:如果函数使用参数作为指向对象的有效指针,那么它自然不能是 nullptr 。所以 _In_ 可以避免这种情况。

SAL 最终是关于描述函数如何使用数据;契约是关于函数与调用代码的接口(interface)。

此外,SAL 可以表达的内容极其有限。它有一些复杂的语句,比如“是一个以空字符结尾的字符串”,但它没有您可以构建自己的基础。契约是 C++ 表达式,因此它们可以验证 C++ 表达式可以验证的任何内容。

关于c++ - MSVC SAL 与 C++2a 合约,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53790941/

10-10 20:39