Почему рекомендуется не разрешать запрашивать уровень контракта для контрактов C ++ 20? - PullRequest
12 голосов
/ 21 мая 2019

Текущий черновик C ++ содержит в [ dcl.attr.contract.check ] p3:

Не должно быть никакого программного способа установки, изменения или запросаУровень сборки модуля перевода.

Я не понимаю, почему рекомендуется не разрешать запрашивать уровень контракта.С текущим макросом assert возможно определить, используется ли утверждение через макрос NDEBUG.

Запрос уровня контракта полезен в некоторых случаях, например:

  • добавление дополнительных переменных для отслеживания дополнительного состояния.
  • преобразование атомарного хранилища в атомарный сравнительный обмен для считывания значения.

Каково обоснование для рекомендации, что запрос уровня сборки невозможен?

1 Ответ

6 голосов
/ 21 мая 2019

Рекомендуется, чтобы реализации не предоставляли такой запрос, потому что это нарушило бы использование смешанного уровня проверки.

В нынешнем виде нет ничего формального в том, чтобы строить библиотеку под одним уровнем проверки и связывать ее с кодом, созданным под другим. Однако, если код может легко запросить, какой уровень проверки доступен, это потенциально может нарушить этот вариант использования. Такой запрос может использоваться для воздействия на ABI типов и так далее Если библиотека имеет такой интерфейс, то вы должны построить код потребления с тем же уровнем проверки, чтобы любые заголовки и тому подобное определяли один и тот же ABI.

Можно ли использовать такой запрос таким образом, чтобы он не влиял на ABI и интерфейсы? Конечно. Но обеспечение теста делает слишком легким , чтобы запутаться.

В текущем состоянии у библиотеки может быть свой собственный тест, #define, который, как ожидается, будет определен при компиляции с определенным уровнем проверки или каким-либо другим. Но такое определение сейчас является частью интерфейса вашей библиотеки. Это только часть вашей документации по сборке; если люди собирают вашу библиотеку с уровнем проверки X, они должны предоставить #define. И любой код, использующий библиотеку, созданную в таких условиях, также должен предоставлять это определение.

И это лучшая часть: код потребления не должен делиться вашим уровнем проверки . Они должны разделить ваше определение , но не фактический уровень проверки. Ваше определение принадлежит библиотеке; уровень проверки принадлежит пользователю.

...