В MSVC есть Функция SAL, который может использоваться для описания параметра, результата и т. д., и он работает хорошо, и переносимость также хороша, функция контракта C ++ 2a, кажется, делает то же самое, может кто-нибудь дать некоторые различия между ними?
Нет реального совпадения между SAL и контрактами. SAL — это аннотирование параметров и возвращаемых значений для описания некоторых аспектов того, как функция использует их. Контракты об описании того, что функция требует его параметров и что может ожидать вызывающая сторона возвращаемого значения. Эти звуки похожи, но они очень разные.
Например, SAL имеет представление о том, является ли параметр входным, выходным или входным / выходным параметром. Это вопрос того, что функция делает с параметрами. Контракты не имеют такого понятия, потому что их не волнует, что функция делает с параметром.
Теперь есть некоторые совпадения. Иногда то, что ожидает функция и что функция выравнивает. Например, если функция ожидает, что параметр указателя не будет nullptr
, вы бы применить [[expects: param != nullptr]]
контракт на эту функцию. Тем не менее, SAL понятие _In_
Примечания к параметру указателя охватывают ту же общую идею: если функция использует параметр в качестве действительного указателя на объект, то, естественно, он не может быть nullptr
, Так _In_
защищает от этого.
В конечном итоге SAL описывает, как функция использует данные; контракты о функции интерфейс с вызывающим кодом.
Кроме того, SAL чрезвычайно ограничен в том, что вы можете выразить. У него есть несколько сложных операторов, таких как «строка с нулевым символом в конце», но у него нет основы, на которой вы можете строить свои собственные. Контракты являются выражениями C ++, и поэтому они могут проверять что-нибудь что выражение C ++ может проверить.
Других решений пока нет …