首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么建议不允许查询C++20合同的合同层?

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

Stack Overflow用户
提问于 2019-05-22 02:30:04
回答 1查看 242关注 0票数 13

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

不应使用编程方式来设置、修改或查询翻译单元的构建级别。

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

在某些情况下,查询合同级别非常有用,例如:

在原子比较交换中添加附加变量以跟踪附加state.

  • transforming原子存储以读取值的

建议不能查询构建级别背后的理由是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-22 03:42:32

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

就目前而言,在一个检查级别下构建一个库,并将其链接到另一个检查级别下构建的代码,在形式上没有任何错误。然而,如果代码可以很容易地查询哪个检查级别是可用的,这可能会破坏这个用例。这样的查询可用于影响类型的ABI等。如果库有这样的接口,那么您必须在相同的检查级别下构建消费代码,以便任何头文件等都将定义相同的ABI。

有没有可能以一种不影响ABI和接口的方式使用这样的查询?好的。但是提供一个测试使得它很容易搞砸。

按照目前的情况,你可以让一个库有它自己的测试,当在特定的检查级别或类似的级别下编译时,期望定义一个#define。但是现在这样的定义是你的库的构建接口的一部分。这只是您的构建文档的一部分;如果人们在check-level X下构建您的库,他们必须提供一个#define。并且任何使用在这种情况下构建的库的代码也必须提供该定义。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56244405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档