3

MSVC にはSAL 機能があり、パラメーター、結果などを記述するために使用できます。これはうまく機能し、移植性も優れています。C++2a のコントラクト機能は同じことを行うようです。誰か教えてください。それらの間の違いは?

4

1 に答える 1

4

SAL と契約の間に実際の重複はありません。SAL は、関数がそれらを使用する方法のいくつかの側面を説明するために、パラメーターと戻り値に注釈を付けることに関するものです。関数がそのパラメーターに必要とするものと、呼び出し元が戻り値に期待できるものを記述することに関する契約。これらは似ているように聞こえますが、大きく異なります。

たとえば、SAL には、パラメーターが入力パラメーター、出力パラメーター、入出力パラメーターのいずれであるかという概念があります。これは、関数がパラメーターをどう処理するかの問題です。コントラクトには、関数がパラメーターで何をするかを気にしないため、そのような概念はありません。

現在、いくつかの重複があります。関数が期待することと関数が実行することが一致する場合があります。たとえば、関数がポインター パラメーターが ではないことを期待している場合、その関数にコントラクトをnullptr適用します。[[pre: param != nullptr]]ただし、ポインター パラメーター アノテーションの SAL 概念は_In_、同じ一般的な考え方をカバーしています。関数がパラメーターをオブジェクトへの有効なポインターとして使用する場合、当然、nullptr. だからそれ_In_から保護します。

SAL は、最終的に関数がデータを使用する方法を記述することです。コントラクトは、呼び出しコードとの関数のインターフェイスに関するものです。

また、SALは表現できるものが非常に限られています。「null で終わる文字列です」などの複雑なステートメントがいくつかありますが、独自に構築できる基盤はありません。コントラクトは C++ 式であるため、C++ 式で検証できるものはすべて検証できます。

于 2018-12-15T15:49:57.167 に答える