为什么建议不允许查询 C++20 合约的合约级别?
Why is it recommended not to allow querying the contract level for C++20 Contracts?
当前 C++ 草案包含,在 [dcl.attr.contract.check] p3:
There should be no programmatic way of setting, modifying, or querying
the build level of a translation unit.
不明白为什么建议不允许查询合约等级。使用当前的 assert
宏,可以检测断言是否通过 NDEBUG
宏使用。
查询合同级别在某些情况下很有用,例如:
- 添加额外的变量来跟踪额外的状态。
- 在原子比较交换中转换原子存储以读取值。
建议无法查询构建级别的理由是什么?
建议实现不要提供这样的查询,因为它会破坏混合 check-level 用法。
就目前而言,在 check-level 下构建一个库并将其链接到在另一个下构建的代码在形式上没有任何错误。但是,如果代码可以轻松查询哪个 check-level 可用,则可能会破坏此用例。这样的查询可用于影响类型的 ABI 等。如果库有这样的接口,那么您必须在相同的 check-level 下构建使用代码,以便任何 headers 等都可以定义相同的 ABI。
是否可以在不影响 ABI 和接口的情况下使用这样的查询?当然。但是提供测试会使太容易搞砸了。
按照目前的情况,您可以让一个库有自己的测试,一个 #define
预计在特定检查级别或类似级别下编译时定义。但是这样的定义现在是您图书馆构建界面的一部分。那只是构建文档的一部分;如果人们在 check-level X 下构建您的库,他们必须提供 #define
。任何使用在这种情况下构建的库的代码也必须提供该定义。
这是最好的部分:消费代码不必共享您的check-level。他们必须共享您的 define,而不是实际的 check-level。你的定义属于图书馆; check-level 属于用户。
当前 C++ 草案包含,在 [dcl.attr.contract.check] p3:
There should be no programmatic way of setting, modifying, or querying the build level of a translation unit.
不明白为什么建议不允许查询合约等级。使用当前的 assert
宏,可以检测断言是否通过 NDEBUG
宏使用。
查询合同级别在某些情况下很有用,例如:
- 添加额外的变量来跟踪额外的状态。
- 在原子比较交换中转换原子存储以读取值。
建议无法查询构建级别的理由是什么?
建议实现不要提供这样的查询,因为它会破坏混合 check-level 用法。
就目前而言,在 check-level 下构建一个库并将其链接到在另一个下构建的代码在形式上没有任何错误。但是,如果代码可以轻松查询哪个 check-level 可用,则可能会破坏此用例。这样的查询可用于影响类型的 ABI 等。如果库有这样的接口,那么您必须在相同的 check-level 下构建使用代码,以便任何 headers 等都可以定义相同的 ABI。
是否可以在不影响 ABI 和接口的情况下使用这样的查询?当然。但是提供测试会使太容易搞砸了。
按照目前的情况,您可以让一个库有自己的测试,一个 #define
预计在特定检查级别或类似级别下编译时定义。但是这样的定义现在是您图书馆构建界面的一部分。那只是构建文档的一部分;如果人们在 check-level X 下构建您的库,他们必须提供 #define
。任何使用在这种情况下构建的库的代码也必须提供该定义。
这是最好的部分:消费代码不必共享您的check-level。他们必须共享您的 define,而不是实际的 check-level。你的定义属于图书馆; check-level 属于用户。