23

C++17 标准在[support.types.layout]中说:

有条件地支持将宏与标准布局offsetof类以外的类型一起使用。

[defns.cond.supp]中:

有条件支持

不需要实现来支持的程序结构

我觉得这个定义offsetof不是很精确。

  • 这是否意味着我可以安全地尝试将它与非标准布局类一起使用?

  • “有条件支持”与定义的实现有何不同?

  • 编译器是否不支持offsetof生成诊断所需的特定类型的类?

4

1 回答 1

15

这是否意味着我可以安全地尝试将它与非标准布局类一起使用?

如果实施允许的话。有条件地支持意味着这必须记录在案。

“有条件支持”与定义的实现有何不同?

引用这个标准:

[defns.cond.supp] 有条件支持- “不需要实现支持的程序结构”

[defns.impl.defined] 实现定义的行为- “行为,对于格式良好的程序构造和正确的数据,取决于实现和每个实现文档”

关键区别在于实现的选择。完全按照标准所说的去做,或者根本不做。比。在没有选择拒绝的情况下以几种方式之一进行。

编译器是否不支持offsetof生成诊断所需的特定类型的类?

如果它是一个符合要求的实现,它将发出诊断([intro.compliance]/2.2由@TC 提供):

“如果程序包含违反任何可诊断规则或出现在本文档中描述为“有条件支持”的构造,而实施不支持该构造,则符合要求的实施应发出至少一条诊断消息。

于 2017-11-27T19:46:53.643 回答