为什么建议不允许查询C ++ 20合同的合同级别?

Tyk*_*ker 13 c++ c++20

当前的C ++草案在[ dcl.attr.contract.check ] p3中包含:

应该没有编程的方式来设置,修改或查询翻译单元的构建级别。

我不明白为什么建议不要允许查询合同级别。使用当前assert宏,可以检测是否通过NDEBUG宏使用了断言。

在某些情况下,查询合同级别很有用:

  • 添加其他变量以跟踪其他状态。
  • 在原子比较交换中转换原子存储以读取值。

建议不要查询构建级别的背后原因是什么?

Nic*_*las 7

建议实现不要提供这样的查询,因为它会破坏混合的检查级别用法。

按照目前的情况,在一个检查级别下构建库并将其链接到在另一个检查级别下构建的代码没有任何形式上的错误。但是,如果代码可以轻松查询可用的检查级别,则可能会破坏该用例。这样的查询可用于影响类型的ABI等。如果库具有这样的接口,那么您必须在相同的检查级别下构建使用代码,以便任何标头和此类都将定义相同的ABI。

是否可以不影响ABI和接口的方式使用此类查询?当然。但是提供测试会使捆绑变得太容易了。

就目前而言,您可以让一个库具有自己的测试,#define该测试应在特定检查级别或类似级别下进行编译时定义。但是现在,这样的定义是您图书馆构建界面的一部分。那只是您的构建文档的一部分;如果人们在检查级别X下构建您的图书馆,则必须提供#define。使用在这种情况下构建的库的任何代码也必须提供该定义。

最好的部分是:使用代码不必共享您的检查级别。他们必须共享您的define,而不是实际的检查级别。您的定义属于该库;检查级别属于用户。