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

标签 c++ c++20

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

There should be no programmatic way of setting, modifying, or querying the build level of a translation unit.

我不明白为什么建议不允许查询契约(Contract)级别。使用当前的 assert 宏,可以通过 NDEBUG 宏检测是否使用了断言。

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

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

建议无法查询构建级别的理由是什么?

最佳答案

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

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

是否可以以不影响 ABI 和接口(interface)的方式使用此类查询?当然。但是提供测试会让它太容易搞砸了。

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

这是最好的部分:消费代码不必共享您的检查级别。他们必须分享您的define,而不是实际的检查级别。您的定义属于图书馆;检查级别属于用户。

关于c++ - 为什么不建议允许查询 C++20 合约的合约级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56244405/

相关文章:

c++ - 如何给QListWidget分配一个特定的数字,以便以后修改?

c++ - 获取MySQL查询返回数据的类型

c++ - 来自 GCC 内部的运算符 '>' 或 '>>' bug 需要模板参数 C++ 中的表达式

c++ - 为什么在具有静态范围的 std::span 中不允许默认构造?

c++ - 使用基于概念的递归函数模板在扣除 'auto [...] ' 之前使用 'auto'

c++ - 阻止对文件的访问

c# - 在 C# 中使用 C++ API

c++ - 如何使用折叠表达式调用成员函数链

c++ - 在字符串中打印 HRESULT 符号(例如,E_FAIL 作为 CString)

c++ - 如何定义任意 std::vector 满足的概念?