对于C++ 17中的非标准布局类,`offsetof`是"有条件支持"是什么意思?

Vit*_*meo 15 c++ offsetof language-lawyer c++17

C++ 17标准说:

[support.types.layout]

有条件地支持offsetof使用非标准布局类的宏.


[defns.cond.supp]

有条件地支持

程序构造不需要实现支持


我觉得这个定义offsetof不太精确.

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

  • "条件支持"与实现定义有何不同?

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

Sto*_*ica 12

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

如果实施允许.有条件支持意味着必须记录.

"条件支持"与实现定义有何不同?

引用此标准:

[defns.cond.supp]有条件支持 - "程序构造,不需要实现支持"

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

关键的区别在于实施的选择.完全按照标准说的那样做,或者根本不做.比.在没有拒绝选项的情况下以多种方式之一进行.

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

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

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

  • [\ [intro.compliance \] /2.2](https://timsong-cpp.github.io/cppwp/intro.compliance#2.2):"如果程序包含[...]中描述的构造的出现当该实施不支持该结构时,该文件为"有条件支持",符合要求的实施应至少发出一条诊断信息." (4认同)
  • 展示将运行的UB的代码可能导致时间旅行的鼻子恶魔.UB展出的代码无法运行不会导致时间旅行的鼻子恶魔.不能运行(无法访问)的错误代码(使程序格式错误的代码)会导致时间旅行(尺寸跳跃?)鼻子恶魔.差异是真实的; 声称它只是UB,因为它没有说它是不合理的,似乎过于乐观了.形成错误的程序对标准没有要求*.抽象机器*执行UB*的程序对它们没有*要求*. (3认同)
  • UB还是形象不对?不可否认,差异是微妙的. (2认同)
  • @Yakk - 我在宏语义或标准布局类型的定义中没有看到任何调用它的格式错误(或者是否需要诊断).我认为这让我们留下了UB. (2认同)